From 4620e02bbc561a4cd4fe74ae8c85d3ceb0ba65f6 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 12:27:55 +0100 Subject: [PATCH 01/13] Changed Json encoder to use lowercase --- ...TeamcityJsonEncoderDecoderConfiguration.cs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs b/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs index 4a40a74f..5852ec49 100644 --- a/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs +++ b/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs @@ -1,9 +1,13 @@ using System.Collections.Generic; +using System.IO; using EasyHttp.Codecs; using EasyHttp.Codecs.JsonFXExtensions; using EasyHttp.Configuration; +using JsonFx.IO; using JsonFx.Json; +using JsonFx.Model; using JsonFx.Serialization; +using JsonFx.Serialization.Filters; namespace TeamCitySharp.Connection { @@ -11,7 +15,7 @@ public class TeamcityJsonEncoderDecoderConfiguration : IEncoderDecoderConfigurat { public IEncoder GetEncoder() { - var jsonWriter = new JsonWriter(new DataWriterSettings(DefaultEncoderDecoderConfiguration.CombinedResolverStrategy() + var jsonWriter = new LowerCaseJsonWriter(new DataWriterSettings(DefaultEncoderDecoderConfiguration.CombinedResolverStrategy() , new TeamCityDateFilter()), new[] { "application/.*json", "text/.*json" }); var writers = new List { jsonWriter }; @@ -29,4 +33,26 @@ public IDecoder GetDecoder() return new DefaultDecoder(dataReaderProvider); } } + + public class LowerCaseJsonWriter : JsonWriter + { + public LowerCaseJsonWriter(DataWriterSettings settings, params string[] contentTypes):base(settings, contentTypes) + {} + + protected override ITextFormatter GetFormatter() + { + return new LowerCaseJsonFormatter(this.Settings); + } + } + + public class LowerCaseJsonFormatter : JsonWriter.JsonFormatter + { + public LowerCaseJsonFormatter(DataWriterSettings settings) : base(settings) + {} + + protected override void WritePropertyName(TextWriter writer, string propertyName) + { + base.WritePropertyName(writer, propertyName.ToLower()); + } + } } \ No newline at end of file From cebb92553ca6b93c456edefe539caf3b3b3adb06 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 12:29:28 +0100 Subject: [PATCH 02/13] Changed Post method to accept object as data, to utilize jsonEncoder --- src/TeamCitySharp/Connection/ITeamCityCaller.cs | 2 +- src/TeamCitySharp/Connection/TeamCityCaller.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TeamCitySharp/Connection/ITeamCityCaller.cs b/src/TeamCitySharp/Connection/ITeamCityCaller.cs index aee4df5c..ec6a95f8 100644 --- a/src/TeamCitySharp/Connection/ITeamCityCaller.cs +++ b/src/TeamCitySharp/Connection/ITeamCityCaller.cs @@ -27,7 +27,7 @@ internal interface ITeamCityCaller void Get(string urlPart); - T Post(string data, string contenttype, string urlPart, string accept); + T Post(object data, string contenttype, string urlPart, string accept); bool Authenticate(string urlPart); diff --git a/src/TeamCitySharp/Connection/TeamCityCaller.cs b/src/TeamCitySharp/Connection/TeamCityCaller.cs index 35879822..60da3dda 100644 --- a/src/TeamCitySharp/Connection/TeamCityCaller.cs +++ b/src/TeamCitySharp/Connection/TeamCityCaller.cs @@ -143,7 +143,7 @@ private HttpResponse GetResponse(string urlPart) return response; } - public T Post(string data, string contenttype, string urlPart, string accept) + public T Post(object data, string contenttype, string urlPart, string accept) { return Post(data, contenttype, urlPart, accept).StaticBody(); } From 1984470a68c9f4819d6aea4e4980d7de077b19c4 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 12:31:59 +0100 Subject: [PATCH 03/13] Changed Projects.Create method to use Json and NewProjectDescription --- src/TeamCitySharp/ActionTypes/Projects.cs | 3 ++- .../DomainEntities/NewProjectDescription.cs | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/TeamCitySharp/DomainEntities/NewProjectDescription.cs diff --git a/src/TeamCitySharp/ActionTypes/Projects.cs b/src/TeamCitySharp/ActionTypes/Projects.cs index 16f87758..680921be 100644 --- a/src/TeamCitySharp/ActionTypes/Projects.cs +++ b/src/TeamCitySharp/ActionTypes/Projects.cs @@ -42,7 +42,8 @@ public Project Details(Project project) public Project Create(string projectName) { - return _caller.Post(projectName, HttpContentTypes.ApplicationXml, "/app/rest/projects/", string.Empty); + var project = new NewProjectDescription {Name = projectName, Id = projectName}; + return _caller.Post(project, HttpContentTypes.ApplicationJson, "/app/rest/projects/", HttpContentTypes.ApplicationJson); } public void Delete(string projectName) diff --git a/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs b/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs new file mode 100644 index 00000000..af1d2912 --- /dev/null +++ b/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using JsonFx.Json; + +namespace TeamCitySharp.DomainEntities +{ + public class NewProjectDescription + { + public string Name { get; set; } + public string Id { get; set; } + } +} From 4eb1f0631c2d295b5dbfd59e13a4bdb68cc6d11f Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 12:42:01 +0100 Subject: [PATCH 04/13] Added NewProjectDescription and added Project.Create with parent project --- src/TeamCitySharp/ActionTypes/Projects.cs | 14 ++++++- .../DomainEntities/NewProjectDescription.cs | 2 + src/TeamCitySharp/Locators/ProjectLocator.cs | 38 +++++++++++++++++++ src/TeamCitySharp/TeamCitySharp.csproj | 2 + 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/TeamCitySharp/Locators/ProjectLocator.cs diff --git a/src/TeamCitySharp/ActionTypes/Projects.cs b/src/TeamCitySharp/ActionTypes/Projects.cs index 680921be..ee9de055 100644 --- a/src/TeamCitySharp/ActionTypes/Projects.cs +++ b/src/TeamCitySharp/ActionTypes/Projects.cs @@ -2,6 +2,7 @@ using EasyHttp.Http; using TeamCitySharp.Connection; using TeamCitySharp.DomainEntities; +using TeamCitySharp.Locators; namespace TeamCitySharp.ActionTypes { @@ -42,7 +43,18 @@ public Project Details(Project project) public Project Create(string projectName) { - var project = new NewProjectDescription {Name = projectName, Id = projectName}; + return Create(projectName, "_Root"); + } + + public Project Create(string projectName, string rootProjectId) + { + var project = new NewProjectDescription + { + Name = projectName, + Id = projectName, + ParentProjectLocator = ProjectLocator.WithId(rootProjectId) + }; + return _caller.Post(project, HttpContentTypes.ApplicationJson, "/app/rest/projects/", HttpContentTypes.ApplicationJson); } diff --git a/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs b/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs index af1d2912..0e67aa81 100644 --- a/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs +++ b/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text; using JsonFx.Json; +using TeamCitySharp.Locators; namespace TeamCitySharp.DomainEntities { @@ -10,5 +11,6 @@ public class NewProjectDescription { public string Name { get; set; } public string Id { get; set; } + public ProjectLocator ParentProjectLocator { get; set; } } } diff --git a/src/TeamCitySharp/Locators/ProjectLocator.cs b/src/TeamCitySharp/Locators/ProjectLocator.cs new file mode 100644 index 00000000..5291db9c --- /dev/null +++ b/src/TeamCitySharp/Locators/ProjectLocator.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; + +namespace TeamCitySharp.Locators +{ + public class ProjectLocator + { + public static ProjectLocator WithId(string id) + { + return new ProjectLocator {Id = id}; + } + + public static ProjectLocator WithName(string name) + { + return new ProjectLocator {Name = name}; + } + + public string Id { get; set; } + public string Name { get; set; } + + public override string ToString() + { + if (!string.IsNullOrEmpty(Id)) + { + return "id:" + Id; + } + + if (!string.IsNullOrEmpty(Name)) + { + return "name:" + Name; + } + + + var locatorFields = new List(); + + return string.Join(",", locatorFields.ToArray()); + } + } +} diff --git a/src/TeamCitySharp/TeamCitySharp.csproj b/src/TeamCitySharp/TeamCitySharp.csproj index 2e7df5aa..d91c468b 100644 --- a/src/TeamCitySharp/TeamCitySharp.csproj +++ b/src/TeamCitySharp/TeamCitySharp.csproj @@ -67,6 +67,8 @@ + + From 787670da8ba41e37bd1135852044c52016ecd057 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 13:08:14 +0100 Subject: [PATCH 05/13] Changed ParentProjectWrapper to produce correct Json data --- src/TeamCitySharp/ActionTypes/Projects.cs | 2 +- .../DomainEntities/NewProjectDescription.cs | 2 +- .../DomainEntities/ParentProjectWrapper.cs | 20 +++++++++++++++++++ src/TeamCitySharp/TeamCitySharp.csproj | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/TeamCitySharp/DomainEntities/ParentProjectWrapper.cs diff --git a/src/TeamCitySharp/ActionTypes/Projects.cs b/src/TeamCitySharp/ActionTypes/Projects.cs index ee9de055..5561f10c 100644 --- a/src/TeamCitySharp/ActionTypes/Projects.cs +++ b/src/TeamCitySharp/ActionTypes/Projects.cs @@ -52,7 +52,7 @@ public Project Create(string projectName, string rootProjectId) { Name = projectName, Id = projectName, - ParentProjectLocator = ProjectLocator.WithId(rootProjectId) + ParentProject = new ParentProjectWrapper(ProjectLocator.WithId(rootProjectId)) }; return _caller.Post(project, HttpContentTypes.ApplicationJson, "/app/rest/projects/", HttpContentTypes.ApplicationJson); diff --git a/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs b/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs index 0e67aa81..42ccf97d 100644 --- a/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs +++ b/src/TeamCitySharp/DomainEntities/NewProjectDescription.cs @@ -11,6 +11,6 @@ public class NewProjectDescription { public string Name { get; set; } public string Id { get; set; } - public ProjectLocator ParentProjectLocator { get; set; } + public ParentProjectWrapper ParentProject { get; set; } } } diff --git a/src/TeamCitySharp/DomainEntities/ParentProjectWrapper.cs b/src/TeamCitySharp/DomainEntities/ParentProjectWrapper.cs new file mode 100644 index 00000000..2bec04da --- /dev/null +++ b/src/TeamCitySharp/DomainEntities/ParentProjectWrapper.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using TeamCitySharp.Locators; + +namespace TeamCitySharp.DomainEntities +{ + public class ParentProjectWrapper + { + private readonly ProjectLocator _locator; + + public ParentProjectWrapper(ProjectLocator locator) + { + _locator = locator; + } + + public string Locator { get { return _locator.ToString(); } } + } +} diff --git a/src/TeamCitySharp/TeamCitySharp.csproj b/src/TeamCitySharp/TeamCitySharp.csproj index d91c468b..6188b235 100644 --- a/src/TeamCitySharp/TeamCitySharp.csproj +++ b/src/TeamCitySharp/TeamCitySharp.csproj @@ -68,6 +68,7 @@ + From a64c02b81e879bd69bb9dc3930daa1b0d70ad0b4 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 13:15:34 +0100 Subject: [PATCH 06/13] Changed lowercase serialization to camelcase --- ...TeamcityJsonEncoderDecoderConfiguration.cs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs b/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs index 5852ec49..339d06e7 100644 --- a/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs +++ b/src/TeamCitySharp/Connection/TeamcityJsonEncoderDecoderConfiguration.cs @@ -15,7 +15,7 @@ public class TeamcityJsonEncoderDecoderConfiguration : IEncoderDecoderConfigurat { public IEncoder GetEncoder() { - var jsonWriter = new LowerCaseJsonWriter(new DataWriterSettings(DefaultEncoderDecoderConfiguration.CombinedResolverStrategy() + var jsonWriter = new CamelCaseJsonWriter(new DataWriterSettings(DefaultEncoderDecoderConfiguration.CombinedResolverStrategy() , new TeamCityDateFilter()), new[] { "application/.*json", "text/.*json" }); var writers = new List { jsonWriter }; @@ -34,25 +34,38 @@ public IDecoder GetDecoder() } } - public class LowerCaseJsonWriter : JsonWriter + public class CamelCaseJsonWriter : JsonWriter { - public LowerCaseJsonWriter(DataWriterSettings settings, params string[] contentTypes):base(settings, contentTypes) + public CamelCaseJsonWriter(DataWriterSettings settings, params string[] contentTypes) + : base(settings, contentTypes) {} protected override ITextFormatter GetFormatter() { - return new LowerCaseJsonFormatter(this.Settings); + return new CamelCaseJsonFormatter(this.Settings); } } - public class LowerCaseJsonFormatter : JsonWriter.JsonFormatter + public class CamelCaseJsonFormatter : JsonWriter.JsonFormatter { - public LowerCaseJsonFormatter(DataWriterSettings settings) : base(settings) + public CamelCaseJsonFormatter(DataWriterSettings settings) + : base(settings) {} protected override void WritePropertyName(TextWriter writer, string propertyName) { - base.WritePropertyName(writer, propertyName.ToLower()); + base.WritePropertyName(writer, CamelCase(propertyName)); + } + + private static string CamelCase(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + + var chars = input.ToCharArray(); + chars[0] = chars[0].ToString().ToLower().ToCharArray()[0]; + + return new string(chars); } } } \ No newline at end of file From a1b41a2527cc4b4136d8f7b91a84841f152e4677 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 7 Jan 2014 13:30:27 +0100 Subject: [PATCH 07/13] Added GenerateId from mavezeau's pull request #60 --- src/TeamCitySharp/ActionTypes/Projects.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/TeamCitySharp/ActionTypes/Projects.cs b/src/TeamCitySharp/ActionTypes/Projects.cs index 5561f10c..69bc82fb 100644 --- a/src/TeamCitySharp/ActionTypes/Projects.cs +++ b/src/TeamCitySharp/ActionTypes/Projects.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Text.RegularExpressions; using EasyHttp.Http; using TeamCitySharp.Connection; using TeamCitySharp.DomainEntities; @@ -51,11 +52,12 @@ public Project Create(string projectName, string rootProjectId) var project = new NewProjectDescription { Name = projectName, - Id = projectName, + Id = GenerateId(projectName), ParentProject = new ParentProjectWrapper(ProjectLocator.WithId(rootProjectId)) }; - return _caller.Post(project, HttpContentTypes.ApplicationJson, "/app/rest/projects/", HttpContentTypes.ApplicationJson); + return _caller.Post(project, HttpContentTypes.ApplicationJson, "/app/rest/projects/", + HttpContentTypes.ApplicationJson); } public void Delete(string projectName) @@ -72,5 +74,11 @@ public void SetProjectParameter(string projectName, string settingName, string s { _caller.PutFormat(settingValue, "/app/rest/projects/name:{0}/parameters/{1}", projectName, settingName); } + + public string GenerateId(string projectName) + { + projectName = Regex.Replace(projectName, @"[^\p{L}\p{N}]+", ""); + return projectName; + } } } \ No newline at end of file From 2b61a16d79b45120cd1fb2554eed41ea47e75f0e Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Fri, 10 Jan 2014 15:37:54 +0100 Subject: [PATCH 08/13] Added options to include/not include disconnected and unauthorized agents --- packages/repositories.config | 1 + src/TeamCitySharp/ActionTypes/Agents.cs | 20 ++++++++++++++++++-- src/TeamCitySharp/ActionTypes/IAgents.cs | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/repositories.config b/packages/repositories.config index bcd17bb0..3468aa5e 100644 --- a/packages/repositories.config +++ b/packages/repositories.config @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/src/TeamCitySharp/ActionTypes/Agents.cs b/src/TeamCitySharp/ActionTypes/Agents.cs index 56944acc..6b9837ee 100644 --- a/src/TeamCitySharp/ActionTypes/Agents.cs +++ b/src/TeamCitySharp/ActionTypes/Agents.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO; using TeamCitySharp.Connection; using TeamCitySharp.DomainEntities; @@ -13,11 +14,26 @@ internal Agents(TeamCityCaller caller) _caller = caller; } - public List All() + public List All(bool includeDisconnected = true, bool includeUnauthorized = true) { - var agentWrapper = _caller.Get("/app/rest/agents"); + var url = string.Format("/app/rest/agents?includeDisconnected={0}&includeUnauthorized={1}", + includeDisconnected.ToString().ToLower(), includeUnauthorized.ToString().ToLower()); + + var agentWrapper = _caller.Get(url); return agentWrapper.Agent; } + + private string AddqueryString(string url, string queryString) + { + if (url.Contains("?")) + url += "&"; + else + url += "?"; + + url += queryString; + + return url; + } } } \ No newline at end of file diff --git a/src/TeamCitySharp/ActionTypes/IAgents.cs b/src/TeamCitySharp/ActionTypes/IAgents.cs index 36b5ade5..1292b1a3 100644 --- a/src/TeamCitySharp/ActionTypes/IAgents.cs +++ b/src/TeamCitySharp/ActionTypes/IAgents.cs @@ -5,6 +5,6 @@ namespace TeamCitySharp.ActionTypes { public interface IAgents { - List All(); + List All(bool includeDisconnected = false, bool includeUnauthorized = false); } } \ No newline at end of file From 2ccd8daa1008b06e1f59318cfdca547aae5209b8 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Fri, 10 Jan 2014 15:38:31 +0100 Subject: [PATCH 09/13] Added Build.ById method --- src/TeamCitySharp/ActionTypes/Builds.cs | 7 +++++++ src/TeamCitySharp/ActionTypes/IBuilds.cs | 1 + src/Tests/IntegrationTests/SampleBuildsUsage.cs | 14 ++++++++++++++ 3 files changed, 22 insertions(+) diff --git a/src/TeamCitySharp/ActionTypes/Builds.cs b/src/TeamCitySharp/ActionTypes/Builds.cs index 4c52f340..ca4bbe9e 100644 --- a/src/TeamCitySharp/ActionTypes/Builds.cs +++ b/src/TeamCitySharp/ActionTypes/Builds.cs @@ -95,6 +95,13 @@ public Build LastErrorBuildByBuildConfigId(string buildConfigId) return builds != null ? builds.FirstOrDefault() : new Build(); } + public Build ById(string id) + { + var build = _caller.GetFormat("/app/rest/builds/id:{0}", id); + + return build ?? new Build(); + } + public List ByBuildConfigId(string buildConfigId) { return ByBuildLocator(BuildLocator.WithDimensions(BuildTypeLocator.WithId(buildConfigId) diff --git a/src/TeamCitySharp/ActionTypes/IBuilds.cs b/src/TeamCitySharp/ActionTypes/IBuilds.cs index 6afba988..2c57fa2a 100644 --- a/src/TeamCitySharp/ActionTypes/IBuilds.cs +++ b/src/TeamCitySharp/ActionTypes/IBuilds.cs @@ -14,6 +14,7 @@ public interface IBuilds Build LastBuildByBuildConfigId(string buildConfigId); List ErrorBuildsByBuildConfigId(string buildConfigId); Build LastErrorBuildByBuildConfigId(string buildConfigId); + Build ById(string id); List ByBuildConfigId(string buildConfigId); List ByConfigIdAndTag(string buildConfigId, string tag); List ByUserName(string userName); diff --git a/src/Tests/IntegrationTests/SampleBuildsUsage.cs b/src/Tests/IntegrationTests/SampleBuildsUsage.cs index 152cad5f..daa77e2e 100644 --- a/src/Tests/IntegrationTests/SampleBuildsUsage.cs +++ b/src/Tests/IntegrationTests/SampleBuildsUsage.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using System.Net; +using System.Runtime.CompilerServices; using NUnit.Framework; using TeamCitySharp.Locators; @@ -190,5 +191,18 @@ public void it_does_not_populate_the_status_text_field_of_the_build_object() Assert.That(build.Count == 1); Assert.IsNull(build[0].StatusText); } + + [Test] + public void ig_returns_correct_build_when_calling_by_id() + { + const string buildId = "5726"; + var client = new TeamCityClient("localhost:81"); + client.Connect("admin", "qwerty"); + + var build = client.Builds.ById(buildId); + + Assert.That(build != null); + Assert.That(build.Id == buildId); + } } } From df6796f12ded8f73b1c80873d8b006d42763d265 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Mon, 3 Feb 2014 08:46:42 +0100 Subject: [PATCH 10/13] Changed post and put to use data object instead of data.ToString --- src/TeamCitySharp/Connection/TeamCityCaller.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TeamCitySharp/Connection/TeamCityCaller.cs b/src/TeamCitySharp/Connection/TeamCityCaller.cs index 60da3dda..dd126fc0 100644 --- a/src/TeamCitySharp/Connection/TeamCityCaller.cs +++ b/src/TeamCitySharp/Connection/TeamCityCaller.cs @@ -42,17 +42,17 @@ public void GetFormat(string urlPart, params object[] parts) public T PostFormat(object data, string contenttype, string accept, string urlPart, params object[] parts) { - return Post(data.ToString(), contenttype, string.Format(urlPart, parts), accept); + return Post(data, contenttype, string.Format(urlPart, parts), accept); } public void PostFormat(object data, string contenttype, string urlPart, params object[] parts) { - Post(data.ToString(), contenttype, string.Format(urlPart, parts), string.Empty); + Post(data, contenttype, string.Format(urlPart, parts), string.Empty); } public void PutFormat(object data, string contenttype, string urlPart, params object[] parts) { - Put(data.ToString(), contenttype, string.Format(urlPart, parts), string.Empty); + Put(data, contenttype, string.Format(urlPart, parts), string.Empty); } public void DeleteFormat(string urlPart, params object[] parts) From bdbc64a4e31088c9d27dbc506b10995d8875c314 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 25 Feb 2014 15:09:40 +0100 Subject: [PATCH 11/13] Added direct support for setting artifact dependencies, snapshot dependencies and build triggers --- src/TeamCitySharp/ActionTypes/BuildConfigs.cs | 18 +++++++++++ .../DomainEntities/ArtifactDependency.cs | 29 +++++++++++++++-- .../DomainEntities/BuildTrigger.cs | 18 +++++++++++ .../DomainEntities/Properties.cs | 10 ++++++ src/TeamCitySharp/DomainEntities/Property.cs | 9 ++++++ .../DomainEntities/SnapshotDependency.cs | 31 +++++++++++++++++-- .../DomainEntities/Source_BuildType.cs | 7 +++++ src/TeamCitySharp/TeamCitySharp.csproj | 1 + 8 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 src/TeamCitySharp/DomainEntities/Source_BuildType.cs diff --git a/src/TeamCitySharp/ActionTypes/BuildConfigs.cs b/src/TeamCitySharp/ActionTypes/BuildConfigs.cs index cdcd4a0f..b01b6271 100644 --- a/src/TeamCitySharp/ActionTypes/BuildConfigs.cs +++ b/src/TeamCitySharp/ActionTypes/BuildConfigs.cs @@ -114,6 +114,24 @@ public void PostRawBuildTrigger(BuildTypeLocator locator, string rawXml) _caller.PostFormat(rawXml, HttpContentTypes.ApplicationXml, "/app/rest/buildTypes/{0}/triggers", locator); } + public void SetArtifactDependency(BuildTypeLocator locator, ArtifactDependency dependency) + { + _caller.PostFormat(dependency, HttpContentTypes.ApplicationJson, + HttpContentTypes.ApplicationJson, "/app/rest/buildTypes/{0}/artifact-dependencies", locator); + } + + public void SetSnapshotDependency(BuildTypeLocator locator, SnapshotDependency dependency) + { + _caller.PostFormat(dependency, HttpContentTypes.ApplicationJson, + HttpContentTypes.ApplicationJson, "/app/rest/buildTypes/{0}/snapshot-dependencies", locator); + } + + public void SetTrigger(BuildTypeLocator locator, BuildTrigger trigger) + { + _caller.PostFormat(trigger, HttpContentTypes.ApplicationJson, HttpContentTypes.ApplicationJson, + "/app/rest/buildTypes/{0}/triggers", locator); + } + public void SetConfigurationParameter(BuildTypeLocator locator, string key, string value) { _caller.PutFormat(value, HttpContentTypes.TextPlain, "/app/rest/buildTypes/{0}/parameters/{1}", locator, key); diff --git a/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs b/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs index 487b9565..6e40a557 100644 --- a/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs +++ b/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs @@ -2,13 +2,38 @@ namespace TeamCitySharp.DomainEntities { public class ArtifactDependency { + public ArtifactDependency() + { + Properties = new Properties(); + } public override string ToString() { - return "artifact_dependency"; + return Type; } public string Id { get; set; } - public string Type { get; set; } public Properties Properties { get; set; } + public Source_BuildType Source_BuildType { get; set; } + public string Type + { + get { return "artifact_dependency"; } + } + + public static ArtifactDependency Default(string dependsOnbuildId) + { + var dependency = new ArtifactDependency(); + + dependency.Properties.Add("cleanDestinationDirectory", "true"); + dependency.Properties.Add("pathRules", "* => Temp"); + dependency.Properties.Add("revisionName", "sameChainOrLastFinished"); + dependency.Properties.Add("revisionValue", "latest.sameChainOrLastFinished"); + + dependency.Source_BuildType = new Source_BuildType + { + Id = dependsOnbuildId + }; + + return dependency; + } } } \ No newline at end of file diff --git a/src/TeamCitySharp/DomainEntities/BuildTrigger.cs b/src/TeamCitySharp/DomainEntities/BuildTrigger.cs index f6f9ec78..96a954ac 100644 --- a/src/TeamCitySharp/DomainEntities/BuildTrigger.cs +++ b/src/TeamCitySharp/DomainEntities/BuildTrigger.cs @@ -2,6 +2,11 @@ namespace TeamCitySharp.DomainEntities { public class BuildTrigger { + public BuildTrigger() + { + Properties = new Properties(); + } + public override string ToString() { return "trigger"; @@ -10,5 +15,18 @@ public override string ToString() public string Id { get; set; } public string Type { get; set; } public Properties Properties { get; set; } + + public static BuildTrigger FinishBuildTrigger(string dependsOnbuildId) + { + var trigger = new BuildTrigger + { + Type = "buildDependencyTrigger" + }; + + trigger.Properties.Add("afterSuccessfulBuildOnly", "true"); + trigger.Properties.Add("dependsOn", dependsOnbuildId); + + return trigger; + } } } \ No newline at end of file diff --git a/src/TeamCitySharp/DomainEntities/Properties.cs b/src/TeamCitySharp/DomainEntities/Properties.cs index bb13d698..dc796224 100644 --- a/src/TeamCitySharp/DomainEntities/Properties.cs +++ b/src/TeamCitySharp/DomainEntities/Properties.cs @@ -4,6 +4,16 @@ namespace TeamCitySharp.DomainEntities { public class Properties { + public Properties() + { + Property = new List(); + } + + public void Add(string name, string value) + { + Property.Add(new Property(name, value)); + } + public override string ToString() { return "properties"; diff --git a/src/TeamCitySharp/DomainEntities/Property.cs b/src/TeamCitySharp/DomainEntities/Property.cs index 70f3cb25..d2dadab0 100644 --- a/src/TeamCitySharp/DomainEntities/Property.cs +++ b/src/TeamCitySharp/DomainEntities/Property.cs @@ -2,6 +2,15 @@ namespace TeamCitySharp.DomainEntities { public class Property { + public Property() + {} + + public Property(string name, string value) + { + Name = name; + Value = value; + } + public override string ToString() { return Name; diff --git a/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs b/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs index 6f0cfe50..e2ab0120 100644 --- a/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs +++ b/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs @@ -2,12 +2,39 @@ namespace TeamCitySharp.DomainEntities { public class SnapshotDependency { + public SnapshotDependency() + { + Properties = new Properties(); + } + public override string ToString() { - return "snapshot_dependency"; + return Type; } public string Id { get; set; } - public Properties Properties { get; set; } + public Properties Properties { get; set; } + public Source_BuildType Source_BuildType { get; set; } + public string Type + { + get { return "snapshot_dependency"; } + } + + public static SnapshotDependency Default(string dependsOnbuildId) + { + var dependency = new SnapshotDependency(); + + dependency.Properties.Add("run-build-if-dependency-failed", "false"); + dependency.Properties.Add("run-build-on-the-same-agent", "false"); + dependency.Properties.Add("take-started-build-with-same-revisions", "true"); + dependency.Properties.Add("take-successful-builds-only", "true"); + + dependency.Source_BuildType = new Source_BuildType + { + Id = dependsOnbuildId + }; + + return dependency; + } } } \ No newline at end of file diff --git a/src/TeamCitySharp/DomainEntities/Source_BuildType.cs b/src/TeamCitySharp/DomainEntities/Source_BuildType.cs new file mode 100644 index 00000000..49242e98 --- /dev/null +++ b/src/TeamCitySharp/DomainEntities/Source_BuildType.cs @@ -0,0 +1,7 @@ +namespace TeamCitySharp.DomainEntities +{ + public class Source_BuildType + { + public string Id { get; set; } + } +} diff --git a/src/TeamCitySharp/TeamCitySharp.csproj b/src/TeamCitySharp/TeamCitySharp.csproj index 6188b235..68eef5f5 100644 --- a/src/TeamCitySharp/TeamCitySharp.csproj +++ b/src/TeamCitySharp/TeamCitySharp.csproj @@ -69,6 +69,7 @@ + From a46360ccec6f0815d54154082ac923cd29444c7f Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 25 Feb 2014 15:56:13 +0100 Subject: [PATCH 12/13] Adjustments to json output of artifactdependencies, snapshotdependencies and buildtriggers --- src/TeamCitySharp/ActionTypes/IBuildConfigs.cs | 7 +++++++ .../DomainEntities/ArtifactDependency.cs | 15 ++++++++------- .../DomainEntities/SnapshotDependency.cs | 13 +++++++------ .../{Source_BuildType.cs => SourceBuildType.cs} | 2 +- src/TeamCitySharp/TeamCitySharp.csproj | 2 +- 5 files changed, 24 insertions(+), 15 deletions(-) rename src/TeamCitySharp/DomainEntities/{Source_BuildType.cs => SourceBuildType.cs} (74%) diff --git a/src/TeamCitySharp/ActionTypes/IBuildConfigs.cs b/src/TeamCitySharp/ActionTypes/IBuildConfigs.cs index 2829ec2d..ef90817d 100644 --- a/src/TeamCitySharp/ActionTypes/IBuildConfigs.cs +++ b/src/TeamCitySharp/ActionTypes/IBuildConfigs.cs @@ -22,9 +22,15 @@ public interface IBuildConfigs void SetConfigurationSetting(BuildTypeLocator locator, string settingName, string settingValue); bool GetConfigurationPauseStatus(BuildTypeLocator locator); void SetConfigurationPauseStatus(BuildTypeLocator locator, bool isPaused); + void PostRawArtifactDependency(BuildTypeLocator locator, string rawXml); + void SetArtifactDependency(BuildTypeLocator locator, ArtifactDependency dependency); + void PostRawBuildStep(BuildTypeLocator locator, string rawXml); + void PostRawBuildTrigger(BuildTypeLocator locator, string rawXml); + void SetTrigger(BuildTypeLocator locator, BuildTrigger trigger); + void SetConfigurationParameter(BuildTypeLocator locator, string key, string value); void PostRawAgentRequirement(BuildTypeLocator locator, string rawXml); void DeleteBuildStep(BuildTypeLocator locator, string buildStepId); @@ -62,6 +68,7 @@ public interface IBuildConfigs /// ]]> /// void PostRawSnapshotDependency(BuildTypeLocator locator, XmlElement rawXml); + void SetSnapshotDependency(BuildTypeLocator locator, SnapshotDependency dependency); /// /// Locates a build type by its locator. diff --git a/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs b/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs index 6e40a557..4278a7c8 100644 --- a/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs +++ b/src/TeamCitySharp/DomainEntities/ArtifactDependency.cs @@ -1,3 +1,5 @@ +using JsonFx.Json; + namespace TeamCitySharp.DomainEntities { public class ArtifactDependency @@ -5,6 +7,7 @@ public class ArtifactDependency public ArtifactDependency() { Properties = new Properties(); + Type = "artifact_dependency"; } public override string ToString() { @@ -13,12 +16,10 @@ public override string ToString() public string Id { get; set; } public Properties Properties { get; set; } - public Source_BuildType Source_BuildType { get; set; } - public string Type - { - get { return "artifact_dependency"; } - } - + [JsonName("source-buildType")] + public SourceBuildType SourceBuildType { get; set; } + public string Type { get; set; } + public static ArtifactDependency Default(string dependsOnbuildId) { var dependency = new ArtifactDependency(); @@ -28,7 +29,7 @@ public static ArtifactDependency Default(string dependsOnbuildId) dependency.Properties.Add("revisionName", "sameChainOrLastFinished"); dependency.Properties.Add("revisionValue", "latest.sameChainOrLastFinished"); - dependency.Source_BuildType = new Source_BuildType + dependency.SourceBuildType = new SourceBuildType { Id = dependsOnbuildId }; diff --git a/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs b/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs index e2ab0120..2cfeb3df 100644 --- a/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs +++ b/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs @@ -1,3 +1,5 @@ +using JsonFx.Json; + namespace TeamCitySharp.DomainEntities { public class SnapshotDependency @@ -5,6 +7,7 @@ public class SnapshotDependency public SnapshotDependency() { Properties = new Properties(); + Type = "snapshot_dependency"; } public override string ToString() @@ -14,11 +17,9 @@ public override string ToString() public string Id { get; set; } public Properties Properties { get; set; } - public Source_BuildType Source_BuildType { get; set; } - public string Type - { - get { return "snapshot_dependency"; } - } + [JsonName("source-buildType")] + public SourceBuildType SourceBuildType { get; set; } + public string Type { get; set; } public static SnapshotDependency Default(string dependsOnbuildId) { @@ -29,7 +30,7 @@ public static SnapshotDependency Default(string dependsOnbuildId) dependency.Properties.Add("take-started-build-with-same-revisions", "true"); dependency.Properties.Add("take-successful-builds-only", "true"); - dependency.Source_BuildType = new Source_BuildType + dependency.SourceBuildType = new SourceBuildType { Id = dependsOnbuildId }; diff --git a/src/TeamCitySharp/DomainEntities/Source_BuildType.cs b/src/TeamCitySharp/DomainEntities/SourceBuildType.cs similarity index 74% rename from src/TeamCitySharp/DomainEntities/Source_BuildType.cs rename to src/TeamCitySharp/DomainEntities/SourceBuildType.cs index 49242e98..e5c1f89f 100644 --- a/src/TeamCitySharp/DomainEntities/Source_BuildType.cs +++ b/src/TeamCitySharp/DomainEntities/SourceBuildType.cs @@ -1,6 +1,6 @@ namespace TeamCitySharp.DomainEntities { - public class Source_BuildType + public class SourceBuildType { public string Id { get; set; } } diff --git a/src/TeamCitySharp/TeamCitySharp.csproj b/src/TeamCitySharp/TeamCitySharp.csproj index 68eef5f5..55d3469d 100644 --- a/src/TeamCitySharp/TeamCitySharp.csproj +++ b/src/TeamCitySharp/TeamCitySharp.csproj @@ -69,7 +69,7 @@ - + From 1437343fb0ac2d108705254b13661492c7a5afc1 Mon Sep 17 00:00:00 2001 From: Nicolai Heilbuth Date: Tue, 14 Jul 2015 08:34:43 +0200 Subject: [PATCH 13/13] Fixed snapshot dependency property types --- src/TeamCitySharp/DomainEntities/SnapshotDependency.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs b/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs index 2cfeb3df..abde4502 100644 --- a/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs +++ b/src/TeamCitySharp/DomainEntities/SnapshotDependency.cs @@ -25,7 +25,8 @@ public static SnapshotDependency Default(string dependsOnbuildId) { var dependency = new SnapshotDependency(); - dependency.Properties.Add("run-build-if-dependency-failed", "false"); + dependency.Properties.Add("run-build-if-dependency-failed", "RUN_ADD_PROBLEM"); + dependency.Properties.Add("run-build-if-dependency-failed-to-start", "MAKE_FAILED_TO_START"); dependency.Properties.Add("run-build-on-the-same-agent", "false"); dependency.Properties.Add("take-started-build-with-same-revisions", "true"); dependency.Properties.Add("take-successful-builds-only", "true");