static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String projectRef = "/project/12352608219";
            Request defectRequest = new Request("Defect");
            defectRequest.Project = projectRef;
            defectRequest.Fetch = new List<string>()
                {
                    "Name",
            "FormattedID",
                    "Tasks"
                };

            defectRequest.Query = new Query("FormattedID", Query.Operator.Equals, "DE8");
            QueryResult defectResults = restApi.Query(defectRequest);
            String defRef = defectResults.Results.First()._ref;
            String defName = defectResults.Results.First().Name;
            Console.WriteLine(defName + " " + defRef);
            DynamicJsonObject defect = restApi.GetByReference(defRef, "Name", "FormattedID", "Tasks");
            String taskCollectionRef = defect["Tasks"]._ref;
            Console.WriteLine(taskCollectionRef);

            ArrayList taskList = new ArrayList();

            foreach (var d in defectResults.Results)
            {
                Request tasksRequest = new Request(d["Tasks"]);
                QueryResult tasksResult = restApi.Query(tasksRequest);
                foreach (var t in tasksResult.Results)
                {
                    var tName = t["Name"];
                    var tFormattedID = t["FormattedID"];
                    Console.WriteLine("Task: " + tName + " " + tFormattedID);
                    DynamicJsonObject task = new DynamicJsonObject();
                    task["_ref"] = t["_ref"];
                    taskList.Add(task);
                }
            }

            Console.WriteLine("Count of elements in the collection before adding a new task: " + taskList.Count);

            DynamicJsonObject newTask = new DynamicJsonObject();
            newTask["Name"] = "another last task";
            newTask["WorkProduct"] = defRef;
            CreateResult createResult = restApi.Create(projectRef, "Task", newTask);
            newTask = restApi.GetByReference(createResult.Reference, "FormattedID", "Name", "WorkProduct");
            Console.WriteLine(newTask["FormattedID"] + " " + newTask["Name"] + " WorkProduct:" + newTask["WorkProduct"]["FormattedID"]);
            taskList.Add(newTask);

            Console.WriteLine("Count of elements in the array after adding a new task: " + taskList.Count);
            defect["Tasks"] = taskList;
            OperationResult updateResult = restApi.Update(defRef, defect);
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi = new RallyRestApi(webServiceVersion: "v2.0");
            String apiKey = "_abc123";
            restApi.Authenticate(apiKey, "https://rally1.rallydev.com", allowSSO: false);

            String[] workspaces = new String[] { "/workspace/12352608129", "/workspace/34900020610" };

            foreach (var s in workspaces)
            {
                Console.WriteLine(" ______________ " + s + " _________________");
                Request typedefRequest = new Request("TypeDefinition");
                typedefRequest.Workspace = s;
                typedefRequest.Fetch = new List<string>() { "ElementName", "Ordinal" };
                typedefRequest.Query = new Query("Parent.Name", Query.Operator.Equals, "Portfolio Item");
                QueryResult typedefResponse = restApi.Query(typedefRequest);

                foreach (var t in typedefResponse.Results)
                {

                    if (t["Ordinal"] > -1)
                    {
                        Console.WriteLine("ElementName: " + t["ElementName"] + " Ordinal: " + t["Ordinal"]);
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            //Initialize the REST API
            RallyRestApi restApi;
            //with this user I get hundreds of workspaces - this is a subadmin
            restApi = new RallyRestApi("*****@*****.**", "supersecret", "https://rally1.rallydev.com", "v2.0");
            //with this user I get only two workspaces
            //restApi = new RallyRestApi("*****@*****.**", "scret", "https://rally1.rallydev.com", "v2.0");

            /***************THIS CODE PRINTS OUT ALL WORKSPACES AND PROJECTS IN THE SUB ******************************/

            //get the current subscription
            DynamicJsonObject sub = restApi.GetSubscription("Workspaces");

            Request wRequest = new Request(sub["Workspaces"]);
            wRequest.Limit = 1000;
            QueryResult queryResult = restApi.Query(wRequest);
            int allProjects = 0;
            foreach (var result in queryResult.Results)
            {
                var workspaceReference = result["_ref"];
                var workspaceName = result["Name"];
                Console.WriteLine("Workspace: " + workspaceName);
                Request projectsRequest = new Request(result["Projects"]);
                projectsRequest.Fetch = new List<string>()
                {
                    "Name",
            "State",
                };
                projectsRequest.Limit = 10000; //project requests are made per workspace
                QueryResult queryProjectResult = restApi.Query(projectsRequest);
                int projectsPerWorkspace = 0;
                foreach (var p in queryProjectResult.Results)
                {
                    allProjects++;
                    projectsPerWorkspace++;
                    Console.WriteLine(projectsPerWorkspace + " Project: " + p["Name"] + " State: " + p["State"]);
                }
            Console.WriteLine("----------------------------");
            }
            Console.WriteLine("Returned " + allProjects + " projects in the subscription");
        }
        static void Main(string[] args)
        {
            //Initialize the REST API using API KEYd
            RallyRestApi restApi;
            restApi = new RallyRestApi("_abc123", "https://rally1.rallydev.com");

            DateTime now = DateTime.Today;
            DateTime checkback = now.AddDays(-2); //last two days
            String checkbackString = checkback.ToString("yyyy-MM-dd");

            //get the subscription
            DynamicJsonObject sub = restApi.GetSubscription("Workspaces");

            Request wRequest = new Request(sub["Workspaces"]);
            wRequest.Limit = 1000;
            QueryResult queryResult = restApi.Query(wRequest);
            foreach (var result in queryResult.Results)
            {
                var workspaceReference = result["_ref"];
                var workspaceName = result["Name"];
                Request projectsRequest = new Request(result["Projects"]);
                projectsRequest.Fetch = new List<string>()
                {
                    "Name"
                };
                projectsRequest.Limit = 1000;
                QueryResult queryProjectResult = restApi.Query(projectsRequest);
                foreach (var p in queryProjectResult.Results)
                {
                    Request artifactRequest = new Request("artifact");
                    artifactRequest.Project = p["_ref"];
                    artifactRequest.Query = new Query("LastUpdateDate", Query.Operator.GreaterThanOrEqualTo, checkbackString);
                    QueryResult queryResults = restApi.Query(artifactRequest);
                    if (queryResults.TotalResultCount > 0)
                    {
                        Console.WriteLine("Project: " + p["Name"] + " (Workspace " + workspaceName + ")");
                    }

                }
            }
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;

            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");
            String workspaceRef = "/workspace/12352608129"; //use your workspace object id

            Request defectRequest = new Request("defect");
            defectRequest.Workspace = workspaceRef;
            defectRequest.Query = new Query("LastUpdateDate", Query.Operator.GreaterThanOrEqualTo, "2014-07-20");
            defectRequest.Fetch = new List<string>()
                {
                    "Name",
                    "FormattedID"
                };

            int stopAfter = 2;  //KEEP IT LOW UNTIL YOU MAKE SURE IT IS DELETING THE INTENDED SUBSET OF YOUR DATA
            int count = 0;
            QueryResult queryDefectResults = restApi.Query(defectRequest);
            foreach (var d in queryDefectResults.Results)
            {
                if (count == stopAfter)
                {
                    break;
                }
                Console.WriteLine("Deleting: " + d["FormattedID"] + " " + d["Name"]);
                OperationResult deleteResult = restApi.Delete(workspaceRef, d["_ref"]); //DELTED DEFECTS WILL BE FOUND IN THE RECYCLE BIN
                count++;
            }
        }
        static void Main(string[] args)
        {
            int storyCount = 0;
            int taskCount = 0;
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String workspaceRef = "/workspace/12352608129";     //replace this OID with an OID of your workspace

            Request sRequest = new Request("HierarchicalRequirement");
            sRequest.Workspace = workspaceRef;
            sRequest.Fetch = new List<string>() { "FormattedID", "Name", "Tasks", "Iteration"};
            sRequest.Query = new Query("(Iteration.StartDate <= Today)").And(new Query("(Iteration.EndDate >= Today)"));
            QueryResult queryResults = restApi.Query(sRequest);

            foreach (var s in queryResults.Results)
            {
                Console.WriteLine("FormattedID: " + s["FormattedID"] + " Name: " + s["Name"]);
                storyCount++;
                Request tasksRequest = new Request(s["Tasks"]);
                QueryResult queryTaskResult = restApi.Query(tasksRequest);
                foreach (var t in queryTaskResult.Results)
                {
                    Console.WriteLine("Task: " + t["FormattedID"] + " State: " + t["State"]);
                    taskCount++;
                }
            }
            Console.WriteLine(storyCount + " stories, " + taskCount + " tasks ");
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String workspaceRef = "/workspace/12345"; //replace this OID with ObjectID of your workspace
            Request revRequest = new Request("Revision");
            revRequest.Workspace = workspaceRef;
            revRequest.Fetch = new List<string>() { "Description", "User", "CreationDate" };

            DateTime now = DateTime.Now;
            Console.WriteLine("now: " + now);

            //look 4 hours back
            //DateTime fourHoursBack = now.AddHours(-4);
            //String fourHoursBackString = fourHoursBack.ToString("yyyy-MM-dd" + "T" + "HH:mm");
            //Console.WriteLine(fourHoursBack);
            //Console.WriteLine(fourHoursBackString);
            //revRequest.Query = new Query("CreationDate", Query.Operator.GreaterThanOrEqualTo, fourHoursBackString);

            //look 10 min back
            DateTime someMinutesBack = now.AddMinutes(-10);
            String someMinutesBackString = someMinutesBack.ToString("yyyy-MM-dd" + "T" + "HH:mm");
            Console.WriteLine("someMinutesBack: " + someMinutesBack);
            Console.WriteLine("someMinutesBackString: " + someMinutesBackString);
            revRequest.Query = new Query("CreationDate", Query.Operator.GreaterThanOrEqualTo, someMinutesBackString);

            QueryResult queryRevResults = restApi.Query(revRequest);

            foreach (var rev in queryRevResults.Results)
            {
                Console.WriteLine("----------");
                Console.WriteLine("Description: " + rev["Description"] + " Author: " + rev["User"]._refObjectName + " CreationDate: " + rev["CreationDate"]);
            }
        }
        static void Main(string[] args)
        {
            int storyCount = 0;
            int taskCount = 0;
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String workspaceRef = "/workspace/1234";     //replace this OID with an OID of your workspace

            Request sRequest = new Request("HierarchicalRequirement");
            sRequest.Workspace = workspaceRef;
            sRequest.Fetch = new List<string>() { "FormattedID", "Name", "Tasks", "Release", "Project", "Owner" };
            sRequest.Query = new Query("Release.Name", Query.Operator.Equals, "r1").And(new Query("Owner", Query.Operator.Equals, "*****@*****.**"));
            QueryResult queryResults = restApi.Query(sRequest);

            foreach (var s in queryResults.Results)
            {
                Console.WriteLine("FormattedID: " + s["FormattedID"] + " Name: " + s["Name"] + " Release: " + s["Release"]._refObjectName + " Project: " + s["Project"]._refObjectName + " Owner: " + s["Owner"]._refObjectName);
                storyCount++;
                Request tasksRequest = new Request(s["Tasks"]);
                QueryResult queryTaskResult = restApi.Query(tasksRequest);
                foreach (var t in queryTaskResult.Results)
                {
                    Console.WriteLine("Task: " + t["FormattedID"] + " State: " + t["State"]);
                    taskCount++;
                }
            }
            Console.WriteLine(storyCount + " stories, "+  taskCount + " tasks ");
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");
            String projectRef = "/project/12352608219";
            Request request = new Request("TestSet");
            request.Project = projectRef;
            request.Fetch = new List<string>()
            {
                "Name",
                "FormattedID",
                "TestCases"
            };
            request.Query = new Query("FormattedID", Query.Operator.Equals, "TS31");
            QueryResult result = restApi.Query(request);

            String testsetRef = result.Results.First()._ref;
            DynamicJsonObject testset = restApi.GetByReference(testsetRef, "TestCases");
            Request request2 = new Request(testset["TestCases"]);
            request2.Fetch = new List<string>()
            {
                "Name",
                "FormattedID"
            };
            request2.Limit = 1000;
            QueryResult result2 = restApi.Query(request2);
            int caseCount = 0;
            foreach (var testcase in result2.Results)
            {
                Console.WriteLine("TestCase: " + testcase["FormattedID"]);
                caseCount++;
            }
            Console.WriteLine(caseCount);
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String workspaceRef = "/workspace/12345";     //replace this OID with an OID of your workspace

            DateTime today = DateTime.Today;
            DateTime checkback = today.AddDays(-2); //last two days
            String checkbackString = checkback.ToString("yyyy-MM-dd");

            Request sRequest = new Request("HierarchicalRequirement");
            sRequest.Workspace = workspaceRef;
            sRequest.Fetch = new List<string>() { "Name", "FormattedID", "RevisionHistory", "Revisions", "LastUpdateDate" };
            sRequest.Query = new Query("LastUpdateDate", Query.Operator.GreaterThanOrEqualTo, checkbackString);
            QueryResult queryResults = restApi.Query(sRequest);

            foreach (var s in queryResults.Results)
            {
                Console.WriteLine("**********************************************************");
                Console.WriteLine("FormattedID: " + s["FormattedID"] + " Name: " + s["Name"]);
                Console.WriteLine("**********************************************************");
                String historyRef = s["RevisionHistory"]._ref;
                Request revisionsRequest = new Request("Revisions");
                revisionsRequest.Query = new Query("RevisionHistory", Query.Operator.Equals, historyRef);
                revisionsRequest.Fetch = new List<string>() { "User", "Description", "RevisionNumber", "CreationDate" };
                QueryResult revisionsResults = restApi.Query(revisionsRequest);
                foreach (var r in revisionsResults.Results)
                {
                    Console.WriteLine("-------------------------------------------------------");
                    Console.WriteLine("Description: " + r["Description"] + " Author: " + r["User"]._refObjectName + " CreationDate: " + r["CreationDate"]);

                }
            }
        }
 public List<dynamic> GetArtifactNotificationForDateRange(RallyRestApi rallyApi, string LastItemDateStamp, string currentRunTime, string projectRef)
 {
     List<dynamic> returnValue;
     Request request = new Request("artifactnotification");
     request.Project = projectRef;
     //request.PageSize = 200;
     request.Limit = 5000;
     request.Fetch = new List<string>() { "IDPrefix", "ID"};
     request.Query = new Query("CreationDate", Query.Operator.GreaterThan, LastItemDateStamp).And(new Query("CreationDate", Query.Operator.LessThanOrEqualTo, currentRunTime));
     try
     {
         QueryResult qr = rallyApi.Query(request);
         var results = qr.Results;
         foreach (var r in results)
         {
             Console.WriteLine(r["IDPrefix"] + r["ID"]);
         }
         returnValue = results.ToList();
         return returnValue;
     }
     catch (Exception)
     {
         throw;
     }
 }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("_abc123", "https://rally1.rallydev.com");

            String projectRef = "/project/12352608219";
            bool projectScopingUp = false;
            bool projectScopingDown = false;

            Request storyRequest = new Request("hierarchicalrequirement");
            storyRequest.Project = projectRef;
            storyRequest.ProjectScopeUp = projectScopingUp;
            storyRequest.ProjectScopeDown = projectScopingDown;
            storyRequest.Limit = 10000;
            storyRequest.Query = new Query("LastUpdateDate", Query.Operator.GreaterThanOrEqualTo, "2013-01-01");

            storyRequest.Fetch = new List<string>()
                {
                    "Name",
                    "FormattedID"
                };

            QueryResult queryResults = restApi.Query(storyRequest);
            int count = 0;
            foreach (var d in queryResults.Results)
            {
                count++;
                Console.WriteLine(count + ". FormattedID: " + d["FormattedID"] + " Name: " + d["Name"]);
            }
            Console.WriteLine("Found " + queryResults.TotalResultCount);
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi = new RallyRestApi(webServiceVersion: "v2.0");
            String apiKey = "_abc123";
            restApi.Authenticate(apiKey, "https://rally1.rallydev.com", allowSSO: false);
            String workspaceRef = "/workspace/12352608129";
            //String projectRef = "/project/39468725060";
            Request request = new Request("Attachment");
            request.Workspace = workspaceRef;
            //request.Project = projectRef;
            request.Fetch = new List<string>() { "Artifact", "TestCaseResult", "Size", "CreationDate" };
            request.Limit = 400;
            request.Order = "CreationDate Desc";
            QueryResult results = restApi.Query(request);

            foreach (var a in results.Results)
            {
                if (a["Artifact"] != null)
                {
                    Console.WriteLine("Artifact: " + a["Artifact"]["_ref"]);
                }
                else if (a["TestCaseResult"] != null)
                {
                    Console.WriteLine("TestCaseResult: " + a["TestCaseResult"]["_ref"]);
                }
                Console.WriteLine("Size: " + a["Size"]);
            }
        }
        public List<dynamic> GetStories(string currentRunTime, string projectRef)
        {
            List<dynamic> returnValue;
            RallyRestApi rallyApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");
            Request request = new Request("HierarchicalRequirement");
            request.Project = projectRef;
            request.ProjectScopeUp = false;
            request.ProjectScopeDown = false;
            request.PageSize = 200;
            try
            {

                QueryResult qr = rallyApi.Query(request);
                var results = qr.Results;
                returnValue = results.ToList();
                while (results.Count() == 200)
                {
                    Console.WriteLine("inside while loop...  " + results.Count());
                    request.Start = returnValue.Count + 1;
                    results = rallyApi.Query(request).Results;
                    returnValue.AddRange(results);
                }
                Console.WriteLine("total results returned...  " + returnValue.Count);
            }
            catch (Exception)
            {
                throw;
            }

            return returnValue;
        }
 static void Main(string[] args)
 {
     String apiKey = "_abc123";
     RallyRestApi restApi = new RallyRestApi(apiKey, "https://rally1.rallydev.com");
     String projectRef = "/project/12352608219";
     Request request = new Request("RecycleBinEntry");
     request.Project = projectRef;
     request.Fetch = new List<string>() { "Name"};
     request.Query = new Query("ID", Query.Operator.Equals, "DE6");
     QueryResult result = restApi.Query(request);
     Console.WriteLine("Name: " + result.Results.First()["Name"]);
 }
        static void Main(string[] args)
        {
            RallyRestApi restApi = new RallyRestApi(webServiceVersion: "v2.0");
            String apiKey = "_abc123";
            restApi.Authenticate(apiKey, "https://rally1.rallydev.com", allowSSO: false);
            String workspaceRef = "/workspace/123";
            String projectRef = "/project/456";

            Request request = new Request("PortfolioItem/Feature");
            request.Fetch = new List<string>() { "Name", "FormattedID" };
            request.Query = new Query("FormattedID", Query.Operator.Equals, "F2356");
            QueryResult result = restApi.Query(request);

            String featureRef = result.Results.First()._ref;
            Console.WriteLine("found" + featureRef);

            //create stories
            try
            {
                for (int i = 1; i <= 25; i++)
                {
                    DynamicJsonObject story = new DynamicJsonObject();
                    story["Name"] = "story " + i;
                    story["PlanEstimate"] = new Random().Next(2,10);
                    story["PortfolioItem"] = featureRef;
                    story["Project"] = projectRef;
                    CreateResult createResult = restApi.Create(workspaceRef, "HierarchicalRequirement", story);
                    story = restApi.GetByReference(createResult.Reference, "FormattedID");
                    Console.WriteLine("creating..." + story["FormattedID"]);
                }
            //read stories
                DynamicJsonObject feature = restApi.GetByReference(featureRef, "UserStories");
                Request storiesRequest = new Request(feature["UserStories"]);
                storiesRequest.Fetch = new List<string>()
                {
                    "FormattedID",
                    "PlanEstimate"
                };
                storiesRequest.Limit = 1000;
                QueryResult storiesResult = restApi.Query(storiesRequest);
                int storyCount = 0;
                foreach (var userStory in storiesResult.Results)
                {
                    Console.WriteLine(userStory["FormattedID"] + " " + userStory["PlanEstimate"]);
                    storyCount++;
                }
                Console.WriteLine(storyCount);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String projectRef = "/project/222";
            Request testSetRequest = new Request("TestSet");
            testSetRequest.Project = projectRef;
            testSetRequest.Fetch = new List<string>()
                {
                    "Name",
            "FormattedID",
                    "TestCases"
                };

            testSetRequest.Query = new Query("FormattedID", Query.Operator.Equals, "TS22");
            QueryResult queryTestSetResults = restApi.Query(testSetRequest);
            String tsRef = queryTestSetResults.Results.First()._ref;
            String tsName = queryTestSetResults.Results.First().Name;
            Console.WriteLine(tsName + " "  + tsRef);
            DynamicJsonObject testSet = restApi.GetByReference(tsRef, "FormattedID", "TestCases");
            String testCasesCollectionRef = testSet["TestCases"]._ref;
            Console.WriteLine(testCasesCollectionRef);

            ArrayList testCasesList = new ArrayList();

            foreach (var ts in queryTestSetResults.Results)
            {
                Request tcRequest = new Request(ts["TestCases"]);
                QueryResult queryTestCasesResult = restApi.Query(tcRequest);
                foreach (var tc in queryTestCasesResult.Results)
                {
                    var tName = tc["Name"];
                    var tFormattedID = tc["FormattedID"];
                    Console.WriteLine("Test Case: " + tName + " " + tFormattedID);
                    DynamicJsonObject aTC = new DynamicJsonObject();
                    aTC["_ref"] = tc["_ref"];
                    testCasesList.Add(aTC);  //add each test case in the collection to array 'testCasesList'
                }
            }

             Console.WriteLine("count of elements in the array before adding a new tc:" + testCasesList.Count);

              DynamicJsonObject anotherTC = new DynamicJsonObject();
              anotherTC["_ref"] = "/testcase/123456789";             //any existing test to add to the collection

               testCasesList.Add(anotherTC);

               Console.WriteLine("count of elements in the array:" + testCasesList.Count);
               testSet["TestCases"] = testCasesList;
               OperationResult updateResult = restApi.Update(tsRef, testSet);
        }
        public Defect GetRallyDefect(string key)
        {
            var request = new Request("defect")
                {
                    Fetch = new List<string> { "Name", "Description", "State", "CreationDate" },
                    Query = new Query("FormattedId", Query.Operator.Equals, key)
                };

            //If we get an exception from the underlying connection, we currently need to swallow it and return a null...
            QueryResult queryResult;
            try
            {
                queryResult = _rallyRestApi.Query(request);
            }
            catch (Exception)
            {
                return null;
            }

            //Likewise if the result is null or we don't get any results...
            if (queryResult == null || !queryResult.Results.Any()) return null;

            var firstResult = queryResult.Results.FirstOrDefault();

            if (firstResult == null)
                return null;

            // Extract the defect id
            var defectIdMatch = DefectIdResolver.Match(firstResult["_ref"] as string);
            if (!defectIdMatch.Success)
                return null;

            var defectId = defectIdMatch.Groups["Id"].Value;

            var baseUri = new Uri(_rallyRestApi.WebServiceUrl);
            var baseUrl = string.Format("{0}://{1}#/detail/defect/{2}", baseUri.Scheme, baseUri.Host, defectId);

            return new Defect
            {
                Id = defectId,
                FormattedId = key,
                Created = DateTime.Parse(firstResult["CreationDate"]),
                State = firstResult["State"],
                Name = firstResult["Name"],
                Description = firstResult["Description"],
                Url = baseUrl
            };
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            //restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");
            restApi = new RallyRestApi("_abc123", "https://rally1.rallydev.com"); //either username/passowrd or API Key authetnication is valid
            String workspaceRef = "/workspace/12352608129";     //replace this OID with an OID of your workspace

            DateTime today = DateTime.Today;
            DateTime checkback = today.AddDays(-5);
            String checkbackString = checkback.ToString("yyyy-MM-dd");

            Request sRequest = new Request("HierarchicalRequirement");
            sRequest.Workspace = workspaceRef;
            sRequest.Fetch = new List<string>() { "Name", "FormattedID", "Changesets", "LastUpdateDate" };
            sRequest.Query = new Query("LastUpdateDate", Query.Operator.GreaterThanOrEqualTo, checkbackString);
            QueryResult queryResults = restApi.Query(sRequest);

            foreach (var s in queryResults.Results)
            {
                Console.WriteLine("**********************************************************");
                Console.WriteLine("FormattedID: " + s["FormattedID"] + " Name: " + s["Name"]);
                Console.WriteLine("**********************************************************");
                Request changesetRequest = new Request("Changesets");
                QueryResult changesetResult = restApi.Query(changesetRequest);
                String author = "None";
                if (changesetResult.TotalResultCount > 0)
                {
                    foreach (var c in changesetResult.Results)
                    {
                        if (c["Author"] != null)
                        {
                            author = c["Author"]._refObjectName;
                        }
                        Console.WriteLine("changeset: Author:" + author + " SCMRepository: " + c["SCMRepository"]._refObjectName + " Message: " + c["Message"]);
                        Request changesRequest = new Request(c["Changes"]);
                        QueryResult changesResult = restApi.Query(changesRequest);
                        foreach (var ch in changesResult.Results)
                        {
                            Console.WriteLine("Change: " + ch["Action"] + " PathAndFilename: " + ch["PathAndFilename"]);
                        }
                    }
                }

            }
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi = new RallyRestApi(webServiceVersion: "v2.0");
            String apiKey = "_abc123";
            restApi.Authenticate(apiKey, "https://rally1.rallydev.com", allowSSO: false);
            String workspaceRef = "/workspace/1011574887"; //non-default workspace of the user
            String projectRef = "/project/1791269111"; //a non-default project of the user (inside the workspace above)
            try
            {
                //create testset
                DynamicJsonObject myTestSet = new DynamicJsonObject();
                myTestSet["Name"] = "important set " + DateTime.Now;
                myTestSet["Project"] = projectRef;

                CreateResult createTestSet = restApi.Create(workspaceRef, "TestSet", myTestSet);
                myTestSet = restApi.GetByReference(createTestSet.Reference, "FormattedID", "Project");
                Console.WriteLine(myTestSet["FormattedID"] + " " + myTestSet["Project"]._refObjectName);

                //find current iteration

                Request iterationRequest = new Request("Iteration");
                iterationRequest.Project = projectRef;
                iterationRequest.ProjectScopeDown = false;
                iterationRequest.ProjectScopeUp = false;
                iterationRequest.Fetch = new List<string>() { "ObjectID", "Name" };
                iterationRequest.Query = new Query("(StartDate <= Today)").And(new Query("(EndDate >= Today)"));
                QueryResult queryResults = restApi.Query(iterationRequest);
                if (queryResults.TotalResultCount > 0)
                {
                    Console.WriteLine(queryResults.Results.First()["Name"] + " " + queryResults.Results.First()["ObjectID"]);
                    myTestSet["Iteration"] = queryResults.Results.First()._ref;
                    OperationResult updateResult = restApi.Update(myTestSet["_ref"], myTestSet);
                }
                else
                {
                    Console.WriteLine("No current iterations");
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        static void Main(string[] args)
        {
            //Initialize the REST API
            RallyRestApi restApi;
               restApi = new RallyRestApi("*****@*****.**", "topsecret", "https://rally1.rallydev.com", "v2.0");

            //Set our Workspace and Project scopings
            String workspaceRef = "/workspace/1111"; //use valid OID of your workspace
            String projectRef = "/project/2222";     //use valid OID of your project
            bool projectScopingUp = false;
            bool projectScopingDown = true;
            Request userRequest = new Request("User");

            userRequest.Workspace = workspaceRef;
            userRequest.Project = projectRef;
            userRequest.ProjectScopeUp = projectScopingUp;
            userRequest.ProjectScopeDown = projectScopingDown;

            /*
                userRequest.Fetch = new List<string>()
                {
                   "Role",
            "CostCenter",
                   "LastLoginDate",
                   "OfficeLocation",
                   "CreationDate"
                };*/

            userRequest.Query = new Query("UserName", Query.Operator.Equals, "*****@*****.**");

            QueryResult userResults = restApi.Query(userRequest);
            String userRef = userResults.Results.First()._ref;
            DynamicJsonObject user = restApi.GetByReference(userRef, "Name", "Role", "CostCenter", "LastLoginDate", "OfficeLocation", "CreationDate");
            String role = user["Role"];
            String costCenter = user["CostCenter"];
            String lastLoginDate = user["LastLoginDate"];
            String officeLocation = user["OfficeLocation"];
            String creationDate = user["CreationDate"];

            Console.WriteLine("Role: " + role + " CostCenter: " + costCenter + " LastLoginDate: " + lastLoginDate + " OfficeLocation: " + officeLocation + " CreationDate: " + creationDate);
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String workspaceRef = "/workspace/12352608129"; //replace this OID with an ObjectID of your workspace
            Request revRequest = new Request("Revision");
            revRequest.Workspace = workspaceRef;
            revRequest.Fetch = new List<string>() { "Description", "User", "CreationDate" };

            DateTime today = DateTime.Today;
            String todayString = today.ToString("yyyy-MM-dd");
            revRequest.Query = new Query("CreationDate", Query.Operator.GreaterThanOrEqualTo, todayString);

            QueryResult queryRevResults = restApi.Query(revRequest);

            foreach (var rev in queryRevResults.Results)
            {
                Console.WriteLine("----------");
                Console.WriteLine("Description: " + rev["Description"] + " Author: " + rev["User"]._refObjectName + " CreationDate: " + rev["CreationDate"]);
            }
        }
        static void Main(string[] args)
        {
            //Initialize the REST API
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            //Set Workspace
            String workspaceRef = "/workspace/12352608129"; //please replace this OID with an OID of your workspace

            Request revRequest = new Request("Revision");
            revRequest.Workspace = workspaceRef;

            revRequest.Fetch = new List<string>() { "Description"};

            DateTime now = DateTime.Today;
            DateTime oneMonthBack = now.AddMonths(-1);
            String thenString = oneMonthBack.ToString("yyyy-MM-dd");

            revRequest.Query = new Query("CreationDate", Query.Operator.GreaterThanOrEqualTo, thenString);

            QueryResult queryRevResults = restApi.Query(revRequest);
            Console.WriteLine(queryRevResults.TotalResultCount);
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            //this app is using old 2.0.1 of .NET Toolkit
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String workspaceRef = "/workspace/12345";     //replace this OID with an OID of your workspace

            Request request = new Request("Artifact");
            request.Workspace = workspaceRef;
            request.Fetch = new List<string>() { "FormattedID", "Name"};
            request.Query = new Query("FormattedID", Query.Operator.Equals, "DE4");
            QueryResult result = restApi.Query(request);
            //since artifact query disregards prefix in FormattedID, it will return DE4, TA4, US4 if they all exist, hence
            //there is no guarantee that the first result will be a defect id we use result.Results.First()._ref as below:
            //String defectRef = result.Results.First()._ref;
            String defectRef = "";
            foreach (var artifact in result.Results)
            {
                Console.WriteLine(artifact["_type"] + ": " + artifact["_ref"]);
                if (artifact["_type"] == "Defect")
                {
                    defectRef = artifact["_ref"];
                }
            }

            Request conversationPostRequest = new Request("ConversationPost");
            conversationPostRequest.Workspace = workspaceRef;
            conversationPostRequest.Query = new Query("Artifact", Query.Operator.Equals, defectRef);
            conversationPostRequest.Fetch = new List<string>() { "Text", "User" };
            QueryResult conversationPostResult = restApi.Query(conversationPostRequest);
            Console.WriteLine("Discussions:-------------------");
            foreach (var post in conversationPostResult.Results)
            {
                Console.WriteLine(post["User"]["_refObjectName"] + ": " + post["Text"]);
            }
        }
        static void Main(string[] args)
        {
            //Initialize the REST API
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "1.43"); //NOTE: 1.43 will be unsupported after June 2014
            Request subRequest = new Request("Subscription");
            subRequest.Fetch = new List<string>()
                {
                    "Name",
                    "ObjectID",
                    "Workspaces",
                    "Projects"
                };

            String subQueryString = "(Name = \"Rally Support\")";
            subRequest.Query = new Query(subQueryString);

            QueryResult subQueryResults = restApi.Query(subRequest);
            foreach (var s in subQueryResults.Results)
            {
                Console.WriteLine("Name: " + s["Name"]);
                Console.WriteLine("ObjectID: " + s["ObjectID"]);
                var workspaces = s["Workspaces"];
                int projectCounter = 0;
                foreach (var w in workspaces)
                {
                    Console.WriteLine("Workspace: " + w["ObjectID"] + " " + w["Name"]);
                    var projects = w["Projects"];
                    foreach (var p in projects)
                    {
                        Console.WriteLine("Project: " + p["ObjectID"] + " " + p["Name"]);
                        projectCounter++;
                    }
                    Console.WriteLine("projects total in the sub: " + projectCounter);
               }
            }
        }
        static void Main(string[] args)
        {
            DateTime today = DateTime.Today;
            DateTime forward = today.AddDays(90);
            String forwardString = forward.ToString("yyyy-MM-dd");
            DateTime back = today.AddDays(-90);
            String backString = back.ToString("yyyy-MM-dd");

            RallyRestApi restApi;
            restApi = new RallyRestApi("_abc123", "https://rally1.rallydev.com"); //either username/passowrd or API Key authetnication is valid
            String workspaceRef = "/workspace/12352608129";     //replace this OID with an OID of your workspace

            Request request = new Request("PortfolioItem/Feature");
            request.Workspace = workspaceRef;
            request.Fetch = new List<string>() {"Name","FormattedID","PlannedStartDate","PlannedEndDate"};
            request.Query = new Query("PlannedStartDate", Query.Operator.GreaterThan, backString).And(new Query("PlannedEndDate", Query.Operator.LessThanOrEqualTo, forwardString));
            QueryResult results = restApi.Query(request);

            foreach (var f in results.Results)
            {
                Console.WriteLine("FormattedID: " + f["FormattedID"] + " Name: " + f["Name"] + " PlannedStartDate: " + f["PlannedStartDate"] + " PlannedEndDate: " + f["PlannedEndDate"]);
                Console.WriteLine("**********************************************************");
            }
        }
        static void Main(string[] args)
        {
            RallyRestApi restApi;
            restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0");

            String projectRef = "/project/123456";     //use valid OID of your project

            Request userRequest = new Request("User");

            userRequest.Query = new Query("UserName", Query.Operator.Equals, "*****@*****.**");

            QueryResult userResults = restApi.Query(userRequest);

            String userRef = userResults.Results.First()._ref;
            Console.WriteLine(userRef);

            DynamicJsonObject myStory = new DynamicJsonObject();
            myStory["Name"] = "a new story";
            myStory["Project"] = projectRef;
            myStory["Owner"] = userRef;
            CreateResult createResult = restApi.Create("HierarchicalRequirement", myStory);
            myStory = restApi.GetByReference(createResult.Reference, "FormattedID", "Owner", "Project");
            Console.WriteLine(myStory["FormattedID"] + " " + myStory["Owner"]._refObjectName + " " + myStory["Project"]._refObjectName);
        }
Exemple #28
0
        /// <summary>
        /// Grabs all User Stories for the indicated parent.  The parent can be an Epic or another User Story
        /// </summary>
        /// <param name="ParentID">Formatted ID of the Parent</param>
        /// <param name="ParentName">Name of the parent, specifically the Epic name</param>
        /// <param name="RootParent">Indicates if the parent is the top-level User Story or not.  If looking for sub-stories, things are handled differently</param>
        public static List<UserStory> GetUserStoriesPerParent(string ParentID, string ParentName, bool RootParent)
        {
            List<UserStory> listReturn = new List<UserStory>();

            // Grab all UserStories under the given Epic
            LogOutput("Using RallyAPI to request story information for all parents...", "GetUserStoriesPerParent", true);
            LogOutput("Building Rally Request...", "GetUserStoriesPerParent", true);
            Request rallyRequest = new Request("HierarchicalRequirement");
            rallyRequest.Fetch = new List<string>() { "Name", "FormattedID", "Release", "Iteration", "Blocked",
                "Owner", "ScheduleState", "DirectChildrenCount", "Description", "PlanEstimate" };
            // If this is the "Root" or highest order User Story, then we want to grab by the FormattedID of the actual portfolio
            // item.  If this is a subordinate, then we want to grab everything where the PARENT object is the FormattedID that
            // we passed into the method
            if (RootParent)
            {
                rallyRequest.Query = new Query("PortfolioItem.FormattedID", Query.Operator.Equals, ParentID);
            }
            else
            {
                rallyRequest.Query = new Query("Parent.FormattedID", Query.Operator.Equals, ParentID);
            }
            LogOutput("Running Rally Query request...", "GetUserStoriesPerParent", true);
            QueryResult rallyResult = RallyAPI.Query(rallyRequest);
            LogOutput("Looping through Query request...", "GetUserStoriesPerParent", true);
            foreach (var result in rallyResult.Results)
            {
                UserStory story = new UserStory();
                story.Name = RationalizeData(result["Name"]);
                story.FormattedID = RationalizeData(result["FormattedID"]);
                story.Owner = RationalizeData(result["Owner"]);
                story.Release = RationalizeData(result["Release"]);
                story.Iteration = RationalizeData(result["Iteration"]);
                story.State = RationalizeData(result["ScheduleState"]);
                story.Children = RationalizeData(result["DirectChildrenCount"]);
                story.Description = RationalizeData(result["Description"]);
                story.ParentProject = ParentID;
                story.ParentEpic = ParentName;
                story.PlanEstimate = RationalizeData(result["PlanEstimate"], true);
                story.Tasks = GetTasksForUserStory(story.FormattedID);
                story.Blocked = RationalizeData(result["Blocked"]);
                LogOutput("Appending new story object to return list...", "GetUserStoriesPerParent", true);
                listReturn.Add(story);
                LogOutput(story.FormattedID + " " + story.Name, "GetUserStoriesPerParent", true);

                // Check for children.  If there are children, then we need to drill down
                // through all children to retrieve the full list of stories
                if (story.Children > 0)
                {
                    // Recursively get child stories until we reach the lowest level
                    listReturn.AddRange(GetUserStoriesPerParent(story.FormattedID.Trim(), "", false));
                }
            }

            LogOutput("Completed processing all stories, returning list", "GetUserStoriesPerParent", true);

            return listReturn;
        }
Exemple #29
0
        /// <summary>
        /// retrieves all Tasks for the indicated User Story
        /// </summary>
        /// <param name="StoryID">Formatted ID of the User Story to get tasks for</param>
        public static List<Task> GetTasksForUserStory(string StoryID)
        {
            List<Task> listReturn = new List<Task>();

            // Grab all Tasks under the given Story
            LogOutput("Using RallyAPI to request task information for all stories...", "GetTasksForUserStory", true);
            LogOutput("Building Rally Request...", "GetTasksForUserStory", true);
            Request rallyRequest = new Request("Tasks");
            rallyRequest.Fetch = new List<string>() { "Name", "FormattedID", "Estimate", "ToDo", "Actuals", "Owner",
                "State", "Description", "LastUpdateDate", "Blocked", "BlockedReason" };
            rallyRequest.Query = new Query("WorkProduct.FormattedID", Query.Operator.Equals, StoryID);
            LogOutput("Running Rally Query request...", "GetTasksForUserStory", true);
            QueryResult rallyResult = RallyAPI.Query(rallyRequest);
            LogOutput("Looping through Query request...", "GetTasksForUserStory", true);
            foreach (var result in rallyResult.Results)
            {
                Task task = new Task();
                task.Name = RationalizeData(result["Name"]);
                task.FormattedID = RationalizeData(result["FormattedID"]);
                task.Owner = RationalizeData(result["Owner"]);
                task.Estimate = (decimal)RationalizeData(result["Estimate"], true);
                task.ToDo = (decimal)RationalizeData(result["ToDo"], true);
                task.Actual = (decimal)RationalizeData(result["Actuals"], true);
                task.State = RationalizeData(result["State"]);
                task.Description = RationalizeData(result["Description"]);
                task.LastUpdate = Convert.ToDateTime(RationalizeData(result["LastUpdateDate"]));
                task.Blocked = RationalizeData(result["Blocked"]);
                task.BlockedReason = RationalizeData(result["BlockedReason"]);
                LogOutput("Appending new task object to return list...", "GetTasksForUserStory", true);
                listReturn.Add(task);
            }

            LogOutput("Completed processing all tasks, returning list", "GetTasksForUserStory", true);

            return listReturn;
        }
Exemple #30
0
        /// <summary>
        /// This will retrieve all projects (Rally "Features") for the passed Initiative
        /// </summary>
        /// <param name="InitiativeID">Formatted ID of the Initiative in Rally</param>
        public static List<Project> GetProjectsForInitiative(string InitiativeID)
        {
            List<Project> listReturn = new List<Project>();

            // Grab all Features under the given initiative
            LogOutput("Using RallyAPI to request project information for all Initiatives...", "GetProjectsForInitiative", true);
            LogOutput("Building Rally Request...", "GetProjectsForInitiative", true);
            //Request rallyRequest = new Request("PortfolioItem/Feature");
            Request rallyRequest = new Request("PortfolioItem/Initiative");
            rallyRequest.Fetch = new List<string>() { "Name", "FormattedID", "Owner", "PlannedStartDate", "PlannedEndDate",
                "ActualEndDate", "c_ProjectUpdate", "c_RevokedReason", "State", "ValueScore", "Description",
                "Expedite", "c_UpdateOwner", "c_Stakeholder", "Project", "LastUpdateDate", "StateChangedDate" };
            rallyRequest.Query = new Query("Parent.Name", Query.Operator.Equals, InitiativeID);
            LogOutput("Running Rally Query request...", "GetProjectsForInitiative", true);
            QueryResult rallyResult = RallyAPI.Query(rallyRequest);
            LogOutput("Looping through Query request...", "GetProjectsForInitiative", true);
            foreach (var result in rallyResult.Results)
            {
                // Create and populate the Project object
                Project proj = new Project();
                proj.Name = RationalizeData(result["Name"]);
                proj.FormattedID = RationalizeData(result["FormattedID"]);
                proj.Owner = RationalizeData(result["Owner"]);
                proj.PlannedEndDate = Convert.ToDateTime(result["PlannedEndDate"]);
                proj.PlannedStartDate = Convert.ToDateTime(result["PlannedStartDate"]);
                proj.ActualEndDate = Convert.ToDateTime(result["ActualEndDate"]);
                proj.LastUpdateDate = Convert.ToDateTime(result["LastUpdateDate"]);
                proj.StatusUpdate = GetPlainTextFromHtml(RationalizeData(result["c_ProjectUpdate"]));
                proj.RevokedReason = RationalizeData(result["c_RevokedReason"]);
                proj.OpportunityAmount = RationalizeData(result["ValueScore"]);
                proj.State = RationalizeData(result["State"]);
                proj.StakeHolder = RationalizeData(result["c_Stakeholder"]);
                proj.Description = GetPlainTextFromHtml(RationalizeData(result["Description"]));
                proj.Expedite = RationalizeData(result["Expedite"]);
                proj.UpdateOwner = RationalizeData(result["c_UpdateOwner"]);
                proj.Initiative = InitiativeID;
                proj.ScrumTeam = RationalizeData(result["Project"]);
                proj.StateChangedDate = Convert.ToDateTime(result["StateChangedDate"]);
                LogOutput("Appending new project object to return list...", "GetProjectsForInitiative", true);
                listReturn.Add(proj);
            }

            LogOutput("Completed processing all projects, returning list", "GetProjectsForInitiative", true);

            return listReturn;
        }