Skip to content

Commit d03f170

Browse files
committed
Merge branch 'release/0.10.0' into production
2 parents e9a6049 + 7ecb1b7 commit d03f170

74 files changed

Lines changed: 1328 additions & 124 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.travis.yml

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,10 @@ language: csharp
33
solution: CSF.Screenplay.sln
44

55
addons:
6-
sauce_connect:
7-
direct_domains: google.com
86
apt:
97
packages:
108
- mono-xsp4
119

12-
matrix:
13-
include:
14-
- env:
15-
- SAUCE_USERNAME="craigfowler_screenplay"
16-
- secure: "ZI+FDrm6aec9HNMS4bbkgUzpeqVwy11flgnqWpYIyG12GzKQmrdXqMoAwD1kimIRNvry4r/z33GhBPDQaHly8edFzlkG4H8ITCyE48qttrVG71j5yYsyk6RLPm28zhcuhmnlalssk9jCsp09YFJ3zRO3Ayj/vboxTkQFhTa8d6nwag+MpfiVZVRdouO3qcKL3lPeWaQECo9hpX8o5MrQDCWprqg7b0ZMgW0vi5bqIFAmKoE/hn+qgp7BUQeVc983D8KClqYBsoJ09crn5ifd3CeCoOzeyczyS/DPrRgOOT63VdllGEQGKQZ78RY1LoloqEbbRI5ibjq7vuc8Er73yzxSbBbnKhG6nHRdfdNwxn2IAtZw86tpNSaKO1u8lprFDLbdCbHu42J6qQx4R8HZcq12Myv1eRYvupQrFv3mDAHK+NWYwCMKvouof50RNnJiFn6zcisvNQXCgG8NWeDBWbszRIwgvmQLsNB/vHCzrHO1bAT4lEYNuFVoUstO8t1r0C7ZVM6Qruuj46J0ZESTo10hUoHCohutdJ0ZAmH4ZxmW57L+BO1eFarkM7hmEZX6fImn0fobNHhSaEy+dNpYa9OS6n4iE6N4teTw20rpZ/AjkLUvJXjMh/YPkQ7M4VvDLqUHh5MPqAbgq3tUEfgPTm+lNy9QibquFwBRsAb3HRU="
17-
- BROWSER_PLATFORM="Windows 10"
18-
- BROWSER_NAME="Chrome"
19-
- env:
20-
- SAUCE_USERNAME="craigfowler_screenplay"
21-
- secure: "ZI+FDrm6aec9HNMS4bbkgUzpeqVwy11flgnqWpYIyG12GzKQmrdXqMoAwD1kimIRNvry4r/z33GhBPDQaHly8edFzlkG4H8ITCyE48qttrVG71j5yYsyk6RLPm28zhcuhmnlalssk9jCsp09YFJ3zRO3Ayj/vboxTkQFhTa8d6nwag+MpfiVZVRdouO3qcKL3lPeWaQECo9hpX8o5MrQDCWprqg7b0ZMgW0vi5bqIFAmKoE/hn+qgp7BUQeVc983D8KClqYBsoJ09crn5ifd3CeCoOzeyczyS/DPrRgOOT63VdllGEQGKQZ78RY1LoloqEbbRI5ibjq7vuc8Er73yzxSbBbnKhG6nHRdfdNwxn2IAtZw86tpNSaKO1u8lprFDLbdCbHu42J6qQx4R8HZcq12Myv1eRYvupQrFv3mDAHK+NWYwCMKvouof50RNnJiFn6zcisvNQXCgG8NWeDBWbszRIwgvmQLsNB/vHCzrHO1bAT4lEYNuFVoUstO8t1r0C7ZVM6Qruuj46J0ZESTo10hUoHCohutdJ0ZAmH4ZxmW57L+BO1eFarkM7hmEZX6fImn0fobNHhSaEy+dNpYa9OS6n4iE6N4teTw20rpZ/AjkLUvJXjMh/YPkQ7M4VvDLqUHh5MPqAbgq3tUEfgPTm+lNy9QibquFwBRsAb3HRU="
22-
- BROWSER_PLATFORM="Windows 10"
23-
- BROWSER_NAME="Firefox"
24-
- env:
25-
- SAUCE_USERNAME="craigfowler_screenplay"
26-
- secure: "ZI+FDrm6aec9HNMS4bbkgUzpeqVwy11flgnqWpYIyG12GzKQmrdXqMoAwD1kimIRNvry4r/z33GhBPDQaHly8edFzlkG4H8ITCyE48qttrVG71j5yYsyk6RLPm28zhcuhmnlalssk9jCsp09YFJ3zRO3Ayj/vboxTkQFhTa8d6nwag+MpfiVZVRdouO3qcKL3lPeWaQECo9hpX8o5MrQDCWprqg7b0ZMgW0vi5bqIFAmKoE/hn+qgp7BUQeVc983D8KClqYBsoJ09crn5ifd3CeCoOzeyczyS/DPrRgOOT63VdllGEQGKQZ78RY1LoloqEbbRI5ibjq7vuc8Er73yzxSbBbnKhG6nHRdfdNwxn2IAtZw86tpNSaKO1u8lprFDLbdCbHu42J6qQx4R8HZcq12Myv1eRYvupQrFv3mDAHK+NWYwCMKvouof50RNnJiFn6zcisvNQXCgG8NWeDBWbszRIwgvmQLsNB/vHCzrHO1bAT4lEYNuFVoUstO8t1r0C7ZVM6Qruuj46J0ZESTo10hUoHCohutdJ0ZAmH4ZxmW57L+BO1eFarkM7hmEZX6fImn0fobNHhSaEy+dNpYa9OS6n4iE6N4teTw20rpZ/AjkLUvJXjMh/YPkQ7M4VvDLqUHh5MPqAbgq3tUEfgPTm+lNy9QibquFwBRsAb3HRU="
27-
- BROWSER_PLATFORM="Windows 10"
28-
- BROWSER_NAME="Internet Explorer"
29-
- env:
30-
- SAUCE_USERNAME="craigfowler_screenplay"
31-
- secure: "ZI+FDrm6aec9HNMS4bbkgUzpeqVwy11flgnqWpYIyG12GzKQmrdXqMoAwD1kimIRNvry4r/z33GhBPDQaHly8edFzlkG4H8ITCyE48qttrVG71j5yYsyk6RLPm28zhcuhmnlalssk9jCsp09YFJ3zRO3Ayj/vboxTkQFhTa8d6nwag+MpfiVZVRdouO3qcKL3lPeWaQECo9hpX8o5MrQDCWprqg7b0ZMgW0vi5bqIFAmKoE/hn+qgp7BUQeVc983D8KClqYBsoJ09crn5ifd3CeCoOzeyczyS/DPrRgOOT63VdllGEQGKQZ78RY1LoloqEbbRI5ibjq7vuc8Er73yzxSbBbnKhG6nHRdfdNwxn2IAtZw86tpNSaKO1u8lprFDLbdCbHu42J6qQx4R8HZcq12Myv1eRYvupQrFv3mDAHK+NWYwCMKvouof50RNnJiFn6zcisvNQXCgG8NWeDBWbszRIwgvmQLsNB/vHCzrHO1bAT4lEYNuFVoUstO8t1r0C7ZVM6Qruuj46J0ZESTo10hUoHCohutdJ0ZAmH4ZxmW57L+BO1eFarkM7hmEZX6fImn0fobNHhSaEy+dNpYa9OS6n4iE6N4teTw20rpZ/AjkLUvJXjMh/YPkQ7M4VvDLqUHh5MPqAbgq3tUEfgPTm+lNy9QibquFwBRsAb3HRU="
32-
- BROWSER_PLATFORM="Windows 10"
33-
- BROWSER_NAME="MicrosoftEdge"
34-
- env:
35-
- SAUCE_USERNAME="craigfowler_screenplay"
36-
- secure: "ZI+FDrm6aec9HNMS4bbkgUzpeqVwy11flgnqWpYIyG12GzKQmrdXqMoAwD1kimIRNvry4r/z33GhBPDQaHly8edFzlkG4H8ITCyE48qttrVG71j5yYsyk6RLPm28zhcuhmnlalssk9jCsp09YFJ3zRO3Ayj/vboxTkQFhTa8d6nwag+MpfiVZVRdouO3qcKL3lPeWaQECo9hpX8o5MrQDCWprqg7b0ZMgW0vi5bqIFAmKoE/hn+qgp7BUQeVc983D8KClqYBsoJ09crn5ifd3CeCoOzeyczyS/DPrRgOOT63VdllGEQGKQZ78RY1LoloqEbbRI5ibjq7vuc8Er73yzxSbBbnKhG6nHRdfdNwxn2IAtZw86tpNSaKO1u8lprFDLbdCbHu42J6qQx4R8HZcq12Myv1eRYvupQrFv3mDAHK+NWYwCMKvouof50RNnJiFn6zcisvNQXCgG8NWeDBWbszRIwgvmQLsNB/vHCzrHO1bAT4lEYNuFVoUstO8t1r0C7ZVM6Qruuj46J0ZESTo10hUoHCohutdJ0ZAmH4ZxmW57L+BO1eFarkM7hmEZX6fImn0fobNHhSaEy+dNpYa9OS6n4iE6N4teTw20rpZ/AjkLUvJXjMh/YPkQ7M4VvDLqUHh5MPqAbgq3tUEfgPTm+lNy9QibquFwBRsAb3HRU="
37-
- BROWSER_PLATFORM="OS X 10.11"
38-
- BROWSER_NAME="Safari"
39-
- BROWSER_VERSION="10.0"
40-
4110
install: Tools/Travis.install.sh
4211

4312
script: Tools/Travis.build.sh

CSF.Screenplay.JsonApis/Abilities/SynchronousJsonGateway.cs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Net.Http;
55
using System.Threading;
66
using System.Threading.Tasks;
7+
using CSF.Screenplay.Stopwatch;
78
using Newtonsoft.Json;
89

910
namespace CSF.Screenplay.JsonApis.Abilities
@@ -52,18 +53,24 @@ HttpResponseMessage GetResponseRespectingTimeout(HttpRequestMessage request, Tim
5253
}
5354
catch(TaskCanceledException ex)
5455
{
55-
throw new TimeoutException($"The JSON API request timed out after {timeout.ToString("g")}.", ex);
56+
var timeFormatter = new TimeSpanFormatter();
57+
var message = String.Format(Resources.ExceptionFormats.ApiRequestTimedOut, timeFormatter.Format(timeout));
58+
throw new TimeoutException(message, ex);
5659
}
5760
catch(HttpRequestException ex)
5861
{
59-
throw new JsonApiException("The JSON API request failed.", ex);
62+
throw new JsonApiException(Resources.ExceptionFormats.UnexpectedApiRequestFailure, ex);
6063
}
6164
catch(AggregateException ex)
6265
{
6366
if(ex.InnerExceptions.OfType<TaskCanceledException>().Any())
64-
throw new TimeoutException($"The JSON API request timed out after {timeout.ToString("g")}.", ex);
67+
{
68+
var timeFormatter = new TimeSpanFormatter();
69+
var message = String.Format(Resources.ExceptionFormats.ApiRequestTimedOut, timeFormatter.Format(timeout));
70+
throw new TimeoutException(message, ex);
71+
}
6572
else if(ex.InnerExceptions.OfType<HttpRequestException>().Any())
66-
throw new JsonApiException("The JSON API request failed.", ex);
73+
throw new JsonApiException(Resources.ExceptionFormats.UnexpectedApiRequestFailure, ex);
6774

6875
throw;
6976
}
@@ -74,8 +81,11 @@ void AssertThatResultIsSuccess(HttpResponseMessage result)
7481
if(result.IsSuccessStatusCode) return;
7582

7683
var responseBody = result.Content.ReadAsStringAsync().Result;
77-
throw new JsonApiException($@"The JSON API request failed: HTTP {result.StatusCode.ToString()}
78-
{responseBody}");
84+
85+
var message = String.Format(Resources.ExceptionFormats.ApiRequestFailedWithStatusCode, (int) result.StatusCode);
86+
throw new JsonApiException(message) {
87+
ErrorResponseBody = responseBody
88+
};
7989
}
8090

8191
protected virtual T ConvertResponse<T>(HttpResponseMessage response)
@@ -85,7 +95,7 @@ protected virtual T ConvertResponse<T>(HttpResponseMessage response)
8595
var copyTask = response.Content.CopyToAsync(buffer);
8696
var waitSuccess = copyTask.Wait(TimeSpan.FromSeconds(1));
8797
if(!waitSuccess)
88-
throw new JsonApiException("Timeout whilst converting JSON response to string. This should probably never happen?!");
98+
throw new JsonApiException(Resources.ExceptionFormats.TimeoutConvertingResponseBody);
8999

90100
buffer.Position = 0;
91101

CSF.Screenplay.JsonApis/CSF.Screenplay.JsonApis.csproj

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<RootNamespace>CSF.Screenplay.JsonApis</RootNamespace>
99
<AssemblyName>CSF.Screenplay.JsonApis</AssemblyName>
1010
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
11-
<ReleaseVersion>0.9.0-alpha</ReleaseVersion>
11+
<ReleaseVersion>0.10.0-alpha</ReleaseVersion>
1212
</PropertyGroup>
1313
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
1414
<DebugSymbols>true</DebugSymbols>
@@ -45,11 +45,18 @@
4545
<Compile Include="Builders\Execute.cs" />
4646
<Compile Include="JsonServiceDescription`1.cs" />
4747
<Compile Include="Abilities\SynchronousJsonGateway.cs" />
48+
<Compile Include="ObjectFormatters\JsonApiExceptionFormatter.cs" />
49+
<Compile Include="ObjectFormatters\TimeoutExceptionFormatter.cs" />
50+
<Compile Include="Resources\ExceptionFormats.Designer.cs">
51+
<DependentUpon>ExceptionFormats.resx</DependentUpon>
52+
</Compile>
4853
</ItemGroup>
4954
<ItemGroup>
5055
<Folder Include="Abilities\" />
5156
<Folder Include="Actions\" />
5257
<Folder Include="Builders\" />
58+
<Folder Include="ObjectFormatters\" />
59+
<Folder Include="Resources\" />
5360
</ItemGroup>
5461
<ItemGroup>
5562
<ProjectReference Include="..\CSF.Screenplay\CSF.Screenplay.csproj">
@@ -61,5 +68,12 @@
6168
<None Include="packages.config" />
6269
<None Include="CSF.Screenplay.JsonApis.nuspec" />
6370
</ItemGroup>
71+
<ItemGroup>
72+
<EmbeddedResource Include="Resources\ExceptionFormats.resx">
73+
<Generator>ResXFileCodeGenerator</Generator>
74+
<LogicalName>ExceptionFormats.resources</LogicalName>
75+
<LastGenOutput>ExceptionFormats.Designer.cs</LastGenOutput>
76+
</EmbeddedResource>
77+
</ItemGroup>
6478
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
6579
</Project>

CSF.Screenplay.JsonApis/CSF.Screenplay.JsonApis.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package>
33
<metadata>
44
<id>CSF.Screenplay.JsonApis</id>
5-
<version>0.9.0-alpha</version>
5+
<version>0.10.0-alpha</version>
66
<title>CSF.Screenplay.JsonApis</title>
77
<authors>CSF Software Ltd</authors>
88
<licenseUrl>https://opensource.org/licenses/MIT</licenseUrl>
@@ -12,7 +12,7 @@
1212
<copyright>Copyright 2018</copyright>
1313
<dependencies>
1414
<dependency id="Newtonsoft.Json" version="[10.0.3,11.0.0)" />
15-
<dependency id="CSF.Screenplay" version="0.9.0-alpha" />
15+
<dependency id="CSF.Screenplay" version="0.10.0-alpha" />
1616
</dependencies>
1717
</metadata>
1818
<files>

CSF.Screenplay.JsonApis/JsonApiException.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@ namespace CSF.Screenplay.JsonApis
77
[System.Serializable]
88
public class JsonApiException : Exception
99
{
10+
/// <summary>
11+
/// Gets or sets the HTTP response body related to a request which raised an error.
12+
/// </summary>
13+
/// <value>The error response body.</value>
14+
public string ErrorResponseBody
15+
{
16+
get {
17+
return this.Data.Contains("ErrorResponseBody") ? (string) this.Data["ErrorResponseBody"] : default(string);
18+
}
19+
set {
20+
this.Data["ErrorResponseBody"] = value;
21+
}
22+
}
23+
1024
/// <summary>
1125
/// Initializes a new instance of the <see cref="T:JsonApiException"/> class
1226
/// </summary>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
using CSF.Screenplay.Reporting;
3+
4+
namespace CSF.Screenplay.JsonApis.ObjectFormatters
5+
{
6+
public class JsonApiExceptionFormatter : ObjectFormatter<JsonApiException>
7+
{
8+
public override string Format(JsonApiException obj) => obj.Message;
9+
}
10+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using CSF.Screenplay.Reporting;
3+
4+
namespace CSF.Screenplay.JsonApis.ObjectFormatters
5+
{
6+
/// <summary>
7+
/// Object formatter for a <c>System.TimeoutException</c>, which just emits the exception message with no other details.
8+
/// </summary>
9+
public class TimeoutExceptionFormatter : ObjectFormatter<TimeoutException>
10+
{
11+
/// <summary>
12+
/// Gets a formatted name for the given input.
13+
/// </summary>
14+
/// <param name="obj">Object.</param>
15+
public override string Format(TimeoutException obj) => obj.Message;
16+
}
17+
}

CSF.Screenplay.JsonApis/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
1818
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
1919

20-
[assembly: AssemblyVersion("0.9.0.0")]
20+
[assembly: AssemblyVersion("0.10.0.0")]
2121

2222
// The following attributes are used to specify the signing key for the assembly,
2323
// if desired. See the Mono documentation for more information about signing.

CSF.Screenplay.JsonApis/Resources/ExceptionFormats.Designer.cs

Lines changed: 74 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<root>
3+
<resheader name="resmimetype">
4+
<value>text/microsoft-resx</value>
5+
</resheader>
6+
<resheader name="version">
7+
<value>2.0</value>
8+
</resheader>
9+
<resheader name="reader">
10+
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
11+
</resheader>
12+
<resheader name="writer">
13+
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
14+
</resheader>
15+
<data name="ApiRequestTimedOut" xml:space="preserve">
16+
<value>The JSON API request timed out after {0}.</value>
17+
</data>
18+
<data name="UnexpectedApiRequestFailure" xml:space="preserve">
19+
<value>The JSON API request failed for an unexpected reason.</value>
20+
</data>
21+
<data name="ApiRequestFailedWithStatusCode" xml:space="preserve">
22+
<value>The JSON API request failed: HTTP {0}.</value>
23+
</data>
24+
<data name="TimeoutConvertingResponseBody" xml:space="preserve">
25+
<value>A timeout error occurred whilst converting the JSON response body from a successful API request.</value>
26+
</data>
27+
</root>

0 commit comments

Comments
 (0)