Add null checks and fix CodeAnalysis errors.

I enabled code analysis to the Octokit.Reactive project and
needed to fix things up.
This commit is contained in:
Haacked
2013-01-29 14:36:24 -08:00
parent 997e955f38
commit e07b6d62c2
17 changed files with 87 additions and 3 deletions

View File

@@ -28,11 +28,15 @@ namespace Octokit.Reactive.Clients
public IObservable<Authorization> Update(long id, AuthorizationUpdate authorization) public IObservable<Authorization> Update(long id, AuthorizationUpdate authorization)
{ {
Ensure.ArgumentNotNull(authorization, "authorization");
return client.Update(id, authorization).ToObservable(); return client.Update(id, authorization).ToObservable();
} }
public IObservable<Authorization> Create(AuthorizationUpdate authorization) public IObservable<Authorization> Create(AuthorizationUpdate authorization)
{ {
Ensure.ArgumentNotNull(authorization, "authorization");
return client.Create(authorization).ToObservable(); return client.Create(authorization).ToObservable();
} }

View File

@@ -17,6 +17,8 @@ namespace Octokit.Reactive.Clients
public IObservable<Organization> Get(string org) public IObservable<Organization> Get(string org)
{ {
Ensure.ArgumentNotNullOrEmptyString(org, "org");
return client.Get(org).ToObservable(); return client.Get(org).ToObservable();
} }
@@ -27,6 +29,8 @@ namespace Octokit.Reactive.Clients
public IObservable<IReadOnlyCollection<Organization>> GetAll(string user) public IObservable<IReadOnlyCollection<Organization>> GetAll(string user)
{ {
Ensure.ArgumentNotNullOrEmptyString(user, "user");
return client.GetAll(user).ToObservable(); return client.GetAll(user).ToObservable();
} }
} }

View File

@@ -17,6 +17,9 @@ namespace Octokit.Reactive.Clients
public IObservable<Repository> Get(string owner, string name) public IObservable<Repository> Get(string owner, string name)
{ {
Ensure.ArgumentNotNullOrEmptyString(owner, "owner");
Ensure.ArgumentNotNullOrEmptyString(name, "name");
return client.Get(owner, name).ToObservable(); return client.Get(owner, name).ToObservable();
} }
@@ -27,16 +30,23 @@ namespace Octokit.Reactive.Clients
public IObservable<IReadOnlyCollection<Repository>> GetAllForUser(string login) public IObservable<IReadOnlyCollection<Repository>> GetAllForUser(string login)
{ {
Ensure.ArgumentNotNullOrEmptyString(login, "login");
return client.GetAllForUser(login).ToObservable(); return client.GetAllForUser(login).ToObservable();
} }
public IObservable<IReadOnlyCollection<Repository>> GetAllForOrg(string organization) public IObservable<IReadOnlyCollection<Repository>> GetAllForOrg(string organization)
{ {
Ensure.ArgumentNotNullOrEmptyString(organization, "organization");
return client.GetAllForOrg(organization).ToObservable(); return client.GetAllForOrg(organization).ToObservable();
} }
public IObservable<Readme> GetReadme(string owner, string name) public IObservable<Readme> GetReadme(string owner, string name)
{ {
Ensure.ArgumentNotNullOrEmptyString(owner, "owner");
Ensure.ArgumentNotNullOrEmptyString(name, "name");
return client.GetReadme(owner, name).ToObservable(); return client.GetReadme(owner, name).ToObservable();
} }
} }

View File

@@ -23,6 +23,8 @@ namespace Octokit.Reactive.Clients
public IObservable<IReadOnlyCollection<SshKey>> GetAll(string user) public IObservable<IReadOnlyCollection<SshKey>> GetAll(string user)
{ {
Ensure.ArgumentNotNullOrEmptyString(user, "user");
return client.GetAll(user).ToObservable(); return client.GetAll(user).ToObservable();
} }
@@ -33,11 +35,15 @@ namespace Octokit.Reactive.Clients
public IObservable<SshKey> Create(SshKeyUpdate key) public IObservable<SshKey> Create(SshKeyUpdate key)
{ {
Ensure.ArgumentNotNull(key, "key");
return client.Create(key).ToObservable(); return client.Create(key).ToObservable();
} }
public IObservable<SshKey> Update(long id, SshKeyUpdate key) public IObservable<SshKey> Update(long id, SshKeyUpdate key)
{ {
Ensure.ArgumentNotNull(key, "key");
return client.Update(id, key).ToObservable(); return client.Update(id, key).ToObservable();
} }

View File

@@ -16,6 +16,8 @@ namespace Octokit.Reactive.Clients
public IObservable<User> Get(string login) public IObservable<User> Get(string login)
{ {
Ensure.ArgumentNotNull(login, "login");
return client.Get(login).ToObservable(); return client.Get(login).ToObservable();
} }
@@ -26,6 +28,8 @@ namespace Octokit.Reactive.Clients
public IObservable<User> Update(UserUpdate user) public IObservable<User> Update(UserUpdate user)
{ {
Ensure.ArgumentNotNull(user, "user");
return client.Update(user).ToObservable(); return client.Update(user).ToObservable();
} }
} }

View File

@@ -10,6 +10,10 @@ namespace Octokit.Reactive
string owner, string owner,
string name) string name)
{ {
Ensure.ArgumentNotNull(client, "client");
Ensure.ArgumentNotNullOrEmptyString(owner, "owner");
Ensure.ArgumentNotNullOrEmptyString(name, "name");
return client.GetReadme(owner, name).SelectMany(r => r.GetHtmlContent().ToObservable()); return client.GetReadme(owner, name).SelectMany(r => r.GetHtmlContent().ToObservable());
} }
} }

View File

@@ -83,6 +83,11 @@
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
<Link>CustomDictionary.xml</Link>
</CodeAnalysisDictionary>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@@ -16,6 +16,8 @@ namespace Octokit.Clients
{ {
public async Task<IReadOnlyCollection<T>> GetAllPages(Func<Task<IReadOnlyPagedCollection<T>>> getFirstPage) public async Task<IReadOnlyCollection<T>> GetAllPages(Func<Task<IReadOnlyPagedCollection<T>>> getFirstPage)
{ {
Ensure.ArgumentNotNull(getFirstPage, "getFirstPage");
var page = await getFirstPage(); var page = await getFirstPage();
var allItems = new List<T>(page); var allItems = new List<T>(page);
while ((page = await page.GetNextPage()) != null) while ((page = await page.GetNextPage()) != null)

View File

@@ -41,6 +41,8 @@ namespace Octokit.Clients
/// <returns></returns> /// <returns></returns>
public async Task<Authorization> Update(long id, AuthorizationUpdate authorization) public async Task<Authorization> Update(long id, AuthorizationUpdate authorization)
{ {
Ensure.ArgumentNotNull(authorization, "authorization");
var endpoint = "/authorizations/{0}".FormatUri(id); var endpoint = "/authorizations/{0}".FormatUri(id);
return await Client.Update(endpoint, authorization); return await Client.Update(endpoint, authorization);
} }
@@ -52,6 +54,8 @@ namespace Octokit.Clients
/// <returns></returns> /// <returns></returns>
public async Task<Authorization> Create(AuthorizationUpdate authorization) public async Task<Authorization> Create(AuthorizationUpdate authorization)
{ {
Ensure.ArgumentNotNull(authorization, "authorization");
return await Client.Create(authorizationsEndpoint, authorization); return await Client.Create(authorizationsEndpoint, authorization);
} }

View File

@@ -28,7 +28,7 @@ namespace Octokit.Clients
public async Task<IReadOnlyCollection<Organization>> GetAll(string user) public async Task<IReadOnlyCollection<Organization>> GetAll(string user)
{ {
Ensure.ArgumentNotNull(user, "user"); Ensure.ArgumentNotNullOrEmptyString(user, "user");
var endpoint = "/users/{0}/orgs".FormatUri(user); var endpoint = "/users/{0}/orgs".FormatUri(user);

View File

@@ -28,7 +28,7 @@ namespace Octokit.Clients
public async Task<IReadOnlyCollection<Repository>> GetAllForUser(string login) public async Task<IReadOnlyCollection<Repository>> GetAllForUser(string login)
{ {
Ensure.ArgumentNotNull(login, "login"); Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = "/users/{0}/repos".FormatUri(login); var endpoint = "/users/{0}/repos".FormatUri(login);
@@ -37,7 +37,7 @@ namespace Octokit.Clients
public async Task<IReadOnlyCollection<Repository>> GetAllForOrg(string organization) public async Task<IReadOnlyCollection<Repository>> GetAllForOrg(string organization)
{ {
Ensure.ArgumentNotNull(organization, "organization"); Ensure.ArgumentNotNullOrEmptyString(organization, "organization");
var endpoint = "/orgs/{0}/repos".FormatUri(organization); var endpoint = "/orgs/{0}/repos".FormatUri(organization);

View File

@@ -20,6 +20,8 @@ namespace Octokit.Clients
public async Task<IReadOnlyCollection<SshKey>> GetAll(string user) public async Task<IReadOnlyCollection<SshKey>> GetAll(string user)
{ {
Ensure.ArgumentNotNullOrEmptyString(user, "user");
var endpoint = "/users/{0}/keys".FormatUri(user); var endpoint = "/users/{0}/keys".FormatUri(user);
return await Client.GetAll(endpoint); return await Client.GetAll(endpoint);

View File

@@ -6,6 +6,8 @@ namespace Octokit
{ {
public static TValue SafeGet<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> dictionary, TKey key) public static TValue SafeGet<TKey, TValue>(this IReadOnlyDictionary<TKey, TValue> dictionary, TKey key)
{ {
Ensure.ArgumentNotNull(dictionary, "dictionary");
TValue value; TValue value;
return dictionary.TryGetValue(key, out value) ? value : default(TValue); return dictionary.TryGetValue(key, out value) ? value : default(TValue);
} }

View File

@@ -19,6 +19,8 @@ namespace Octokit
public static Uri FormatUri(this string pattern, params object[] args) public static Uri FormatUri(this string pattern, params object[] args)
{ {
Ensure.ArgumentNotNullOrEmptyString(pattern, "pattern");
return new Uri(string.Format(CultureInfo.InvariantCulture, pattern, args), UriKind.Relative); return new Uri(string.Format(CultureInfo.InvariantCulture, pattern, args), UriKind.Relative);
} }

View File

@@ -26,28 +26,39 @@ namespace Octokit.Http
public async Task<T> Get(Uri endpoint) public async Task<T> Get(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
return await GetItem<T>(endpoint); return await GetItem<T>(endpoint);
} }
public async Task<TOther> GetItem<TOther>(Uri endpoint) public async Task<TOther> GetItem<TOther>(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
var response = await Connection.GetAsync<TOther>(endpoint); var response = await Connection.GetAsync<TOther>(endpoint);
return response.BodyAsObject; return response.BodyAsObject;
} }
public async Task<string> GetHtml(Uri endpoint) public async Task<string> GetHtml(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
var response = await Connection.GetHtml(endpoint); var response = await Connection.GetHtml(endpoint);
return response.Body; return response.Body;
} }
public async Task<IReadOnlyCollection<T>> GetAll(Uri endpoint) public async Task<IReadOnlyCollection<T>> GetAll(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
return await pagination.GetAllPages(async () => await GetPage(endpoint)); return await pagination.GetAllPages(async () => await GetPage(endpoint));
} }
public async Task<T> Create(Uri endpoint, object data) public async Task<T> Create(Uri endpoint, object data)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
Ensure.ArgumentNotNull(data, "data");
var response = await Connection.PostAsync<T>(endpoint, data); var response = await Connection.PostAsync<T>(endpoint, data);
return response.BodyAsObject; return response.BodyAsObject;
@@ -55,6 +66,9 @@ namespace Octokit.Http
public async Task<T> Update(Uri endpoint, object data) public async Task<T> Update(Uri endpoint, object data)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
Ensure.ArgumentNotNull(data, "data");
var response = await Connection.PatchAsync<T>(endpoint, data); var response = await Connection.PatchAsync<T>(endpoint, data);
return response.BodyAsObject; return response.BodyAsObject;
@@ -62,11 +76,15 @@ namespace Octokit.Http
public async Task Delete(Uri endpoint) public async Task Delete(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
await Connection.DeleteAsync<T>(endpoint); await Connection.DeleteAsync<T>(endpoint);
} }
async Task<IReadOnlyPagedCollection<T>> GetPage(Uri endpoint) async Task<IReadOnlyPagedCollection<T>> GetPage(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
var response = await Connection.GetAsync<List<T>>(endpoint); var response = await Connection.GetAsync<List<T>>(endpoint);
return new ReadOnlyPagedCollection<T>(response, Connection); return new ReadOnlyPagedCollection<T>(response, Connection);
} }

View File

@@ -42,6 +42,7 @@ namespace Octokit.Http
Ensure.ArgumentNotNull(credentialStore, "credentialStore"); Ensure.ArgumentNotNull(credentialStore, "credentialStore");
Ensure.ArgumentNotNull(httpClient, "httpClient"); Ensure.ArgumentNotNull(httpClient, "httpClient");
Ensure.ArgumentNotNull(serializer, "serializer"); Ensure.ArgumentNotNull(serializer, "serializer");
if (!baseAddress.IsAbsoluteUri) if (!baseAddress.IsAbsoluteUri)
{ {
throw new ArgumentException( throw new ArgumentException(
@@ -58,6 +59,8 @@ namespace Octokit.Http
public async Task<IResponse<T>> GetAsync<T>(Uri endpoint) public async Task<IResponse<T>> GetAsync<T>(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
return await Run<T>(new Request return await Run<T>(new Request
{ {
Method = HttpMethod.Get, Method = HttpMethod.Get,
@@ -68,6 +71,8 @@ namespace Octokit.Http
public async Task<IResponse<string>> GetHtml(Uri endpoint) public async Task<IResponse<string>> GetHtml(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
return await GetHtml(new Request return await GetHtml(new Request
{ {
Method = HttpMethod.Get, Method = HttpMethod.Get,
@@ -78,6 +83,9 @@ namespace Octokit.Http
public async Task<IResponse<T>> PatchAsync<T>(Uri endpoint, object body) public async Task<IResponse<T>> PatchAsync<T>(Uri endpoint, object body)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
Ensure.ArgumentNotNull(body, "body");
return await Run<T>(new Request return await Run<T>(new Request
{ {
Method = HttpVerb.Patch, Method = HttpVerb.Patch,
@@ -89,6 +97,9 @@ namespace Octokit.Http
public async Task<IResponse<T>> PostAsync<T>(Uri endpoint, object body) public async Task<IResponse<T>> PostAsync<T>(Uri endpoint, object body)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
Ensure.ArgumentNotNull(body, "body");
return await Run<T>(new Request return await Run<T>(new Request
{ {
Method = HttpMethod.Post, Method = HttpMethod.Post,
@@ -100,6 +111,8 @@ namespace Octokit.Http
public async Task DeleteAsync<T>(Uri endpoint) public async Task DeleteAsync<T>(Uri endpoint)
{ {
Ensure.ArgumentNotNull(endpoint, "endpoint");
await Run<T>(new Request await Run<T>(new Request
{ {
Method = HttpMethod.Delete, Method = HttpMethod.Delete,

View File

@@ -24,6 +24,8 @@ namespace Octokit.Http
protected async virtual Task<IResponse<T>> BuildResponse<T>(HttpResponseMessage responseMessage) protected async virtual Task<IResponse<T>> BuildResponse<T>(HttpResponseMessage responseMessage)
{ {
Ensure.ArgumentNotNull(responseMessage, "responseMessage");
var response = new ApiResponse<T> var response = new ApiResponse<T>
{ {
Body = await responseMessage Body = await responseMessage
@@ -71,6 +73,8 @@ namespace Octokit.Http
{ {
public static HttpResponseMessage EnsureSuccess(this HttpResponseMessage response) public static HttpResponseMessage EnsureSuccess(this HttpResponseMessage response)
{ {
Ensure.ArgumentNotNull(response, "response");
if (response.IsSuccessStatusCode) if (response.IsSuccessStatusCode)
{ {
return response; return response;