public void Setup()
        {
            _keys = GetKeys();
            var client = new NexosisClient();

            _sut = new ContestRepository(_keys, client);
        }
예제 #2
0
        public async Task ProcessesQuotas()
        {
            var handler = new FakeHttpMessageHandler {
                ContentResult = new StringContent("{ }")
            };

            handler.ResponseHeaders.Add("nexosis-account-datasetcount-allotted", new[] { "100" });
            handler.ResponseHeaders.Add("nexosis-account-datasetcount-current", new[] { "99" });
            handler.ResponseHeaders.Add("nexosis-account-predictioncount-allotted", new[] { "50" });
            handler.ResponseHeaders.Add("nexosis-account-predictioncount-current", new[] { "49" });
            handler.ResponseHeaders.Add("nexosis-account-sessioncount-allotted", new[] { "1000" });
            handler.ResponseHeaders.Add("nexosis-account-sessioncount-current", new[] { "999" });


            var target = new NexosisClient("abcdefg", "https://nada.nexosis.com/not-here", new ApiConnection.HttpClientFactory(() => handler));

            var result = await target.GetAccountBalance();

            Assert.Equal(100, result.DataSetCount.Allotted);
            Assert.Equal(99, result.DataSetCount.Current);

            Assert.Equal(50, result.PredictionCount.Allotted);
            Assert.Equal(49, result.PredictionCount.Current);

            Assert.Equal(1000, result.SessionCount.Allotted);
            Assert.Equal(999, result.SessionCount.Current);
        }
예제 #3
0
        public async Task CanHandleErrorResponse()
        {
            var data = new ErrorResponse
            {
                StatusCode   = 500,
                ErrorType    = "SomethingWentWrong",
                Message      = "An error occurred",
                ErrorDetails = new Dictionary <string, object> {
                    { "error", "details" }
                }
            };
            var handler = new FakeHttpMessageHandler {
                ReturnStatus = HttpStatusCode.InternalServerError, ContentResult = new StringContent(JsonConvert.SerializeObject(data)),
            };

            var target = new NexosisClient("abcdefg", "https://nada.nexosis.com/not-here", new ApiConnection.HttpClientFactory(() => handler));

            var exception = await Assert.ThrowsAsync <NexosisClientException>(async() => await target.GetAccountBalance());

            Assert.Equal(HttpStatusCode.InternalServerError, exception.StatusCode);
            Assert.NotNull(exception.ErrorResponse);
            Assert.Equal(data.ErrorType, exception.ErrorResponse.ErrorType);
            Assert.Equal(data.Message, exception.ErrorResponse.Message);
            Assert.Equal(data.ErrorDetails, exception.ErrorResponse.ErrorDetails);
        }
예제 #4
0
        public void GetsKeyFromEnvironment()
        {
            Environment.SetEnvironmentVariable(NexosisClient.NexosisApiKeyEnvironmentVariable, "abcdefg");
            var target = new NexosisClient();

            Assert.Equal("abcdefg", target.ApiKey);
        }
예제 #5
0
        // gets results for a session and saves to local db
        private static async Task Results(string database, Guid sessionId)
        {
            var api     = new NexosisClient(Environment.GetEnvironmentVariable("NEXOSIS_PROD_KEY"));
            var results = await api.Sessions.GetResults(sessionId);

            // only save results if we actually have them
            if (results.Status != Status.Completed)
            {
                Console.Out.WriteLine($"Unable to get results from session in {results.Status} state.");
                return;
            }

            // save results
            using (var db = OpenDatabase(database))
            {
                // if there is more to save, then do it
                UpdateSession(sessionId, db, results);

                using (var tran = db.BeginTransaction())
                {
                    CleanResults(sessionId, db);
                    foreach (var item in results.Data)
                    {
                        AddResult(sessionId, db, item);
                    }
                    tran.Commit();
                }

                db.Close();
            }
        }
예제 #6
0
        // pulls data from local db and submits to API
        private static async Task UploadData(string database, string dataSetName, DateTimeOffset?startDate, DateTimeOffset?endDate, string source = null, string interval = "hour")
        {
            var columns = new Dictionary <string, ColumnMetadata>
            {
                { "timestamp", new ColumnMetadata {
                      DataType = ColumnType.Date, Role = ColumnRole.Timestamp
                  } },
                { "value", new ColumnMetadata {
                      DataType = ColumnType.Numeric, Role = ColumnRole.Target
                  } }
            };
            var api = new NexosisClient("249c5810fd58403c9e2bfeae423a72fd"); //Environment.GetEnvironmentVariable("NEXOSIS_PROD_KEY"));

            using (var db = OpenDatabase(database))
            {
                var measurements = LoadMeasurements(db, startDate, endDate, source, interval);
                var batchSize    = 5000;

                // there is a limit on request size so we batch the data that is to be uploaded
                for (int i = 0; i < ((measurements.Count / batchSize) + 1); i++)
                {
                    var ds = await api.DataSets.Create(
                        DataSet.From(dataSetName,
                                     new DataSetDetail {
                        Columns = columns, Data = measurements.Skip(i *batchSize).Take(batchSize).ToList()
                    }
                                     ));

                    Console.Out.WriteLine($"Added to data set named {ds.DataSetName}.");
                }
                db.Close();
            }
        }
예제 #7
0
 public NexosisClient_TestsBase(object data)
 {
     JsonConvert.DefaultSettings = () => { return(new JsonSerializerSettings {
             NullValueHandling = NullValueHandling.Ignore
         }); };
     handler = new FakeHttpMessageHandler {
         ContentResult = new StringContent(JsonConvert.SerializeObject(data))
     };
     target = new NexosisClient("abcdefg", baseUri.ToString(), new ApiConnection.HttpClientFactory(() => handler));
 }
예제 #8
0
        public async Task AddsUserAgentToRequest()
        {
            var handler = new FakeHttpMessageHandler {
                ContentResult = new StringContent(JsonConvert.SerializeObject(new { }))
            };
            var target = new NexosisClient("abcdefg", "https://nada.nexosis.com/not-here", new ApiConnection.HttpClientFactory(() => handler));

            await target.GetAccountBalance();

            Assert.True(handler.Request.Headers.Contains("User-Agent"));
            Assert.Equal(NexosisClient.ClientVersion, handler.Request.Headers.GetValues("User-Agent").First());
        }
        public async Task ProcessesCostAndBalance()
        {
            var handler = new FakeHttpMessageHandler {
                ContentResult = new StringContent("{ }")
            };

            handler.ResponseHeaders.Add("nexosis-request-cost", new[] { "123.12 USD" });
            handler.ResponseHeaders.Add("nexosis-account-balance", new[] { "999.99 USD" });

            var target = new NexosisClient("abcdefg", "https://nada.nexosis.com/not-here", new ApiConnection.HttpClientFactory(() => handler));

            var result = await target.GetAccountBalance();

            Assert.Equal(123.12m, result.Cost.Amount);
            Assert.Equal("USD", result.Cost.Currency);
            Assert.Equal(999.99m, result.Balance.Amount);
            Assert.Equal("USD", result.Balance.Currency);
        }
예제 #10
0
        // submits a forecast session
        private static async Task Forecast(string database, string dataSetName, DateTimeOffset startDate, DateTimeOffset endDate, string interval = "Day")
        {
            var api = new NexosisClient(Environment.GetEnvironmentVariable("NEXOSIS_PROD_KEY"));

            if (!Enum.TryParse(interval, /*ignoreCase*/ true, out ResultInterval parsedInterval))
            {
                parsedInterval = ResultInterval.Day;
            }
            // given the name of the dataset, the 'column' of the data to predict on and the date range, it is easy to kick it off.
            var foreacstSession = await api.Sessions.CreateForecast(Sessions.Forecast(dataSetName, startDate, endDate, parsedInterval, "value"));

            using (var db = OpenDatabase(database))
            {
                SetupSessionResults(db);
                AddSessionRecord(db, foreacstSession.SessionId, dataSetName, foreacstSession.RequestedDate);
            }

            Console.Out.WriteLine($"Creating hourly forecast on {dataSetName} data from {startDate:O} to {endDate:O}. Session id: {foreacstSession.SessionId}");
        }
        public IntegrationTestFixture()
        {
            string baseUrl = "https://ml.nexosis.com/v1";

            baseUrl             = Environment.GetEnvironmentVariable(NexosisClient.NexosisApiUriEnvironmentVariable);
            ForecastDataSetName = "forecast.015ce681-ca24-449d-a673-699aff25a0cc";
            Client = new NexosisClient(Environment.GetEnvironmentVariable(NexosisClient.NexosisApiKeyEnvironmentVariable)
                                       , baseUrl
                                       , new ApiConnection.HttpClientFactory());

            var dataSetTask = Client.DataSets.Create(DataSet.From(ForecastDataSetName,
                                                                  DataSetGenerator.Run(DateTime.Parse("2016-01-01"), DateTime.Parse("2017-03-26"), "instances")));

            dataSetTask.GetAwaiter().GetResult();

            var keyedDatasetTask = Client.DataSets.Create(DataSet.From(ModelDataSetName,
                                                                       DataSetGenerator.Run(90, 10, "instances")));

            keyedDatasetTask.GetAwaiter().GetResult();
        }
예제 #12
0
        private static async Task ListItems(string listType, string database)
        {
            var api = new NexosisClient(Environment.GetEnvironmentVariable("NEXOSIS_PROD_KEY"));

            if (listType.Equals("data", StringComparison.OrdinalIgnoreCase))
            {
                var results = await api.DataSets.List();

                foreach (var r in results.Items)
                {
                    Console.Out.WriteLine(r.DataSetName);
                }
            }
            else if (listType.Equals("remote-sessions", StringComparison.OrdinalIgnoreCase))
            {
                var results = await api.Sessions.List();

                Console.Out.WriteLine("SessionId                           \tRequested Date                   \tStart Date                         \tEnd Date                         \tType      \tStatus");
                foreach (var r in results.Items)
                {
                    Console.Out.WriteLine($"{r.SessionId:D}\t{r.RequestedDate:O}\t{r.StartDate:O}\t{r.EndDate:O}\t{r.Type.ToString("G").PadRight(10)}\t{r.Status}");
                }
            }
            else if (listType.Equals("local-sessions", StringComparison.OrdinalIgnoreCase))
            {
                using (var db = OpenDatabase(database))
                    using (var sessions = GetSessions(db))
                    {
                        Console.Out.WriteLine("SessionId                           \tRequested Date                   \tName");
                        while (sessions.Read())
                        {
                            Console.WriteLine($"{Guid.Parse(sessions.GetString(0)):D}\t{sessions.GetDateTime(2):O}\t{sessions.GetString(1)}");
                        }
                    }
            }
        }
예제 #13
0
        public void CanGiveKeyWhenConstructing()
        {
            var target = new NexosisClient("asdfasdfasdf");

            Assert.Equal("asdfasdfasdf", target.ApiKey);
        }
예제 #14
0
        public void AddsTrailingSlashWhenNeeded()
        {
            var target = new NexosisClient("alpha-bravo-delta-charlie", "https://should.have.a.slash", new ApiConnection.HttpClientFactory());

            Assert.Equal("https://should.have.a.slash/", target.ConfiguredUrl);
        }