add gendarme support, ignore some rules and fix our implementation

This commit is contained in:
Tommy Parnell
2015-06-19 13:35:05 -07:00
parent a84b02986e
commit c255375368
13 changed files with 240 additions and 63 deletions

2
.gitignore vendored
View File

@@ -25,7 +25,7 @@ build/
bld/ bld/
[Bb]in/ [Bb]in/
[Oo]bj/ [Oo]bj/
output/
# Visual Studo 2015 cache/options directory # Visual Studo 2015 cache/options directory
.vs/ .vs/

View File

@@ -4,4 +4,5 @@
<package id="NUnit.Runners" version="2.6.4" /> <package id="NUnit.Runners" version="2.6.4" />
<package id="OpenCover" version="4.5.3723" /> <package id="OpenCover" version="4.5.3723" />
<package id="ReportGenerator" version="2.1.4.0" /> <package id="ReportGenerator" version="2.1.4.0" />
<package id="Mono.Gendarme" version="2.11.0.20121120" />
</packages> </packages>

View File

@@ -11,6 +11,22 @@
This is a c# wrapper around the Untappd API. This can be downloaded via [Nuget](https://www.nuget.org/packages/Untappd.Net/), or the [backup feed](https://www.myget.org/F/untappd-net/api/v2). This is a c# wrapper around the Untappd API. This can be downloaded via [Nuget](https://www.nuget.org/packages/Untappd.Net/), or the [backup feed](https://www.myget.org/F/untappd-net/api/v2).
## Building via command line
If you wish to build via command line install ruby, and ruby gems. Open up a console in the root directory of this project, and then run the following:
* `gem install rake`
* `gem install bundle`
* `bundle`
* `rake preflight`
## My PR is broken, it works in VS!
if your pull request is broken either one of two things is happening.
1. Your changes are not mono compatible, which prevent linux users from using your changes. This will only happen if travis ci says your build is broken, but appveyor does not.
2. You have added gendarme violations. You can run gendarme locally by running `rake preflight` from your console.
## API Coverage ## API Coverage
Current both Authenticated and Unauthenticated requests. Current both Authenticated and Unauthenticated requests.

View File

@@ -23,7 +23,7 @@ desc 'Run the tests'
task :test => [:nunit] task :test => [:nunit]
desc 'Retrieve, Build, Test' desc 'Retrieve, Build, Test'
task :preflight => [:retrieve, :build, :test] task :preflight => [:retrieve, :build, :test, :cs_lint]
@@ -37,6 +37,25 @@ test_runner :nunit do |tests|
tests.exe = "packages/NUnit.Runners.2.6.4/tools/nunit-console.exe" # executable to run tests with tests.exe = "packages/NUnit.Runners.2.6.4/tools/nunit-console.exe" # executable to run tests with
end end
task :cs_lint do
unless Dir.exists?('output')
Dir.mkdir('output')
end
CMD_PREFIX = ""
if !OS.windows?
CMD_PREFIX = "mono"
end
sh "#{CMD_PREFIX} packages/Mono.Gendarme.2.11.0.20121120/tools/gendarme.exe src/Untappd.Net/bin/#{Configuration}/Untappd.Net.dll --html output/gendarme.html --severity high+ --ignore assets/gendarme/gendarme.ignore"
end
# task :tests => :'tests:unit' # task :tests => :'tests:unit'
#task :ensure_nuget_key do #task :ensure_nuget_key do

View File

@@ -1,6 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013 # Visual Studio 2012
VisualStudioVersion = 12.0.31101.0 VisualStudioVersion = 12.0.31101.0
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Untappd.Net", "src\Untappd.Net\Untappd.Net.csproj", "{D8571A44-2E86-43A3-B64A-2364614C6934}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Untappd.Net", "src\Untappd.Net\Untappd.Net.csproj", "{D8571A44-2E86-43A3-B64A-2364614C6934}"
@@ -23,14 +23,58 @@ Global
Release|Any CPU = Release|Any CPU Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D8571A44-2E86-43A3-B64A-2364614C6934}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Release|Any CPU.Build.0 = Release|Any CPU
{513A3FB2-6664-40E7-A03E-591D852C42E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {513A3FB2-6664-40E7-A03E-591D852C42E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{513A3FB2-6664-40E7-A03E-591D852C42E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {513A3FB2-6664-40E7-A03E-591D852C42E4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{513A3FB2-6664-40E7-A03E-591D852C42E4}.Release|Any CPU.ActiveCfg = Release|Any CPU {513A3FB2-6664-40E7-A03E-591D852C42E4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{513A3FB2-6664-40E7-A03E-591D852C42E4}.Release|Any CPU.Build.0 = Release|Any CPU {513A3FB2-6664-40E7-A03E-591D852C42E4}.Release|Any CPU.Build.0 = Release|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D8571A44-2E86-43A3-B64A-2364614C6934}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
EndGlobalSection
GlobalSection(MonoDevelopProperties) = preSolution
StartupItem = src\Untappd.Net\Untappd.Net.csproj
Policies = $0
$0.DotNetNamingPolicy = $1
$1.DirectoryNamespaceAssociation = PrefixedHierarchical
$1.ResourceNamePolicy = FileFormatDefault
$0.TextStylePolicy = $2
$2.inheritsSet = VisualStudio
$2.inheritsScope = text/plain
$2.scope = text/x-csharp
$0.CSharpFormattingPolicy = $3
$3.IndentSwitchBody = True
$3.IndentBlocksInsideExpressions = True
$3.AnonymousMethodBraceStyle = NextLine
$3.PropertyBraceStyle = NextLine
$3.PropertyGetBraceStyle = NextLine
$3.PropertySetBraceStyle = NextLine
$3.EventBraceStyle = NextLine
$3.EventAddBraceStyle = NextLine
$3.EventRemoveBraceStyle = NextLine
$3.StatementBraceStyle = NextLine
$3.ElseNewLinePlacement = NewLine
$3.CatchNewLinePlacement = NewLine
$3.FinallyNewLinePlacement = NewLine
$3.WhileNewLinePlacement = DoNotCare
$3.ArrayInitializerWrapping = DoNotChange
$3.ArrayInitializerBraceStyle = NextLine
$3.BeforeMethodDeclarationParentheses = False
$3.BeforeMethodCallParentheses = False
$3.BeforeConstructorDeclarationParentheses = False
$3.NewLineBeforeConstructorInitializerColon = NewLine
$3.NewLineAfterConstructorInitializerColon = SameLine
$3.BeforeDelegateDeclarationParentheses = False
$3.NewParentheses = False
$3.SpacesBeforeBrackets = False
$3.inheritsSet = Mono
$3.inheritsScope = text/x-csharp
$3.scope = text/x-csharp
$0.StandardHeader = $4
$4.Text =
$4.IncludeInNewFiles = True
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -0,0 +1,60 @@
# we have hard coded strings...sue us
R: Gendarme.Rules.Design.PreferUriOverStringRule
A: *
# We don't really care if our exceptions are not serializable
R: Gendarme.Rules.Serialization.MissingSerializationConstructorRule
A: Untappd.Net
# Either implement or do not bother
R: Gendarme.Rules.Exceptions.MissingExceptionConstructorsRule
A: Untappd.Net
# TODO: Implement
R: Gendarme.Rules.BadPractice.DoNotForgetNotImplementedMethodsRule
N: Untappd.Net
R: Gendarme.Rules.Design.ConsiderAddingInterfaceRule
T: Untappd.Net.Request.BasicRequest # This class is an abstract class, its inheritors should implement the interface
T: Untappd.Net.SingleObjectArrayConverter # We should figure out how to implement the write json here...
A: Untappd.Net
# Microsoft says we shouldn't dispose tasks ourselves
R: Gendarme.Rules.Correctness.EnsureLocalDisposalRule
M: System.Void Untappd.Net.Request.Repository/<ExecuteRequestAsync>c__async0`1::MoveNext()
# We use the obsolete constructor for testing
R: Gendarme.Rules.Performance.AvoidUncalledPrivateCodeRule
T: Untappd.Net.Request.Repository
# we really want constants
R: Gendarme.Rules.BadPractice.AvoidVisibleConstantFieldRule
T: Untappd.Net.Constants
# for json binding
R: Gendarme.Rules.Naming.AvoidNonAlphanumericIdentifierRule
A: Untappd.Net
# cannot be helped
R: Gendarme.Rules.Naming.AvoidDeepNamespaceHierarchyRule
A: Untappd.Net
R: Gendarme.Rules.Maintainability.AvoidLackOfCohesionOfMethodsRule
A: Untappd.Net
# We need to multiple call
R: Gendarme.Rules.Performance.AvoidRepetitiveCallsToPropertiesRule
T: Untappd.Net.Request.Repository
# we want to do this here
R: Gendarme.Rules.Exceptions.DoNotSwallowErrorsCatchingNonSpecificExceptionsRule
M: System.Void Untappd.Net.Request.Repository/<ExecuteRequestAsync>c__async0`1::MoveNext()
# We violate case sometimes for json bindings
R: Gendarme.Rules.Naming.UseCorrectCasingRule
A: Untappd.Net
# TODO: Serialize properly
R: Gendarme.Rules.Serialization.ImplementISerializableCorrectlyRule
T: Untappd.Net.Exception.HttpErrorException

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -33,10 +33,6 @@
<Reference Include="Moq"> <Reference Include="Moq">
<HintPath>..\..\packages\Moq.4.2.1502.0911\lib\net40\Moq.dll</HintPath> <HintPath>..\..\packages\Moq.4.2.1502.0911\lib\net40\Moq.dll</HintPath>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="nunit.core"> <Reference Include="nunit.core">
<HintPath>..\..\packages\NUnitTestAdapter.1.2\lib\nunit.core.dll</HintPath> <HintPath>..\..\packages\NUnitTestAdapter.1.2\lib\nunit.core.dll</HintPath>
<Private>False</Private> <Private>False</Private>
@@ -56,10 +52,6 @@
<HintPath>..\..\packages\NUnitTestAdapter.1.2\lib\NUnit.VisualStudio.TestAdapter.dll</HintPath> <HintPath>..\..\packages\NUnitTestAdapter.1.2\lib\NUnit.VisualStudio.TestAdapter.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="RestSharp, Version=105.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\RestSharp.105.0.1\lib\net4\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
@@ -67,6 +59,12 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="RestSharp">
<HintPath>..\..\packages\RestSharp.105.0.1\lib\net4\RestSharp.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Responses\Actions\TestCheckInAction.cs" /> <Compile Include="Responses\Actions\TestCheckInAction.cs" />
@@ -98,7 +96,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Untappd.Net\Untappd.Net.csproj"> <ProjectReference Include="..\Untappd.Net\Untappd.Net.csproj">
<Project>{d8571a44-2e86-43a3-b64a-2364614c6934}</Project> <Project>{D8571A44-2E86-43A3-B64A-2364614C6934}</Project>
<Name>Untappd.Net</Name> <Name>Untappd.Net</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>

View File

@@ -4,6 +4,7 @@ using RestSharp;
namespace Untappd.Net.Exception namespace Untappd.Net.Exception
{ {
[Serializable]
public sealed class HttpErrorException : BaseUntappdException public sealed class HttpErrorException : BaseUntappdException
{ {
public override string Message public override string Message
@@ -17,6 +18,14 @@ namespace Untappd.Net.Exception
private readonly string _message; private readonly string _message;
public HttpErrorException(IRestRequest request, IRestResponse response) public HttpErrorException(IRestRequest request, IRestResponse response)
{ {
if(request == null)
{
throw new ArgumentNullException("request");
}
if (response == null)
{
throw new ArgumentNullException("response");
}
var code = (int) response.StatusCode; var code = (int) response.StatusCode;
if (code == 200) if (code == 200)
{ {

View File

@@ -5,6 +5,9 @@ using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following // General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
using System;
[assembly: AssemblyTitle("Untappd.Net")] [assembly: AssemblyTitle("Untappd.Net")]
[assembly: AssemblyDescription("C# Untappd Wrapper")] [assembly: AssemblyDescription("C# Untappd Wrapper")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
@@ -13,6 +16,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] [assembly: AssemblyCopyright("Copyright © Microsoft 2015")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: CLSCompliantAttribute(true)]
// Setting ComVisible to false makes the types in this assembly not visible // Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from // to COM components. If you need to access a type in this assembly from

View File

@@ -13,7 +13,7 @@ namespace Untappd.Net.Request
{ {
internal IRestClient Client; internal IRestClient Client;
internal IRestRequest Request; internal IRestRequest Request;
private bool FailFast { get; set; } bool FailFast { get; set; }
/// <summary> /// <summary>
/// Event to listen to when failFast is set to false /// Event to listen to when failFast is set to false
/// This allows you to capture the excpetion, before its swallowed /// This allows you to capture the excpetion, before its swallowed
@@ -65,28 +65,30 @@ namespace Untappd.Net.Request
return this; return this;
} }
private TResult ExecuteRequest<TResult>() TResult ExecuteRequest<TResult>()
where TResult : class where TResult : class
{ {
return ProcessExecution<TResult>(Client.Execute(Request)); return ProcessExecution<TResult>(Client.Execute(Request));
} }
private async Task<TResult> ExecuteRequestAsync<TResult>() async Task<TResult> ExecuteRequestAsync<TResult>()
where TResult : class where TResult : class
{ {
return ProcessExecution<TResult>(await Client.ExecuteTaskAsync(Request)); return ProcessExecution<TResult>(await Client.ExecuteTaskAsync(Request));
} }
private TResult ProcessExecution<TResult>(IRestResponse response) TResult ProcessExecution<TResult>(IRestResponse response)
where TResult : class where TResult : class
{ {
//if the return type is not 200 throw errors //if the return type is not 200 throw errors
if (response.StatusCode != HttpStatusCode.OK) if (response.StatusCode != HttpStatusCode.OK)
{ {
var excpetion = new HttpErrorException(Request, response); var excpetion = new HttpErrorException(Request, response);
if (OnExceptionThrown != null) var eventThrow = OnExceptionThrown;
if (eventThrow != null)
{ {
OnExceptionThrown(this, new UnhandledExceptionEventArgs(excpetion, FailFast)); eventThrow(this, new UnhandledExceptionEventArgs(excpetion, FailFast));
} }
if (FailFast) if (FailFast)
{ {
@@ -101,9 +103,11 @@ namespace Untappd.Net.Request
} }
catch(System.Exception e) catch(System.Exception e)
{ {
if (OnExceptionThrown != null) var eventThrow = OnExceptionThrown;
if (eventThrow != null)
{ {
OnExceptionThrown(this, new UnhandledExceptionEventArgs(e, FailFast)); eventThrow(this, new UnhandledExceptionEventArgs(e, FailFast));
} }
if (FailFast) if (FailFast)
{ {

View File

@@ -1,5 +1,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Untappd.Net.Authentication; using Untappd.Net.Authentication;
using System;
namespace Untappd.Net.Request namespace Untappd.Net.Request
{ {
@@ -13,6 +14,15 @@ namespace Untappd.Net.Request
/// <returns>returns dynamic since often the return doesn't matter</returns> /// <returns>returns dynamic since often the return doesn't matter</returns>
public dynamic Post(IAuthenticatedUntappdCredentials credentials, IAction action) public dynamic Post(IAuthenticatedUntappdCredentials credentials, IAction action)
{ {
if (credentials == null)
{
throw new ArgumentNullException("credentials");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
return ConfigureRequest(credentials, action.EndPoint, action.BodyParameters, action.RequestMethod) return ConfigureRequest(credentials, action.EndPoint, action.BodyParameters, action.RequestMethod)
.ExecuteRequest<dynamic>(); .ExecuteRequest<dynamic>();
} }
@@ -25,6 +35,15 @@ namespace Untappd.Net.Request
/// <returns>returns dynamic since often the return doesn't matter</returns> /// <returns>returns dynamic since often the return doesn't matter</returns>
public Task<dynamic> PostAsync(IAuthenticatedUntappdCredentials credentials, IAction action) public Task<dynamic> PostAsync(IAuthenticatedUntappdCredentials credentials, IAction action)
{ {
if (credentials == null)
{
throw new ArgumentNullException("credentials");
}
if (action == null)
{
throw new ArgumentNullException("action");
}
return ConfigureRequest(credentials, action.EndPoint, action.BodyParameters, action.RequestMethod) return ConfigureRequest(credentials, action.EndPoint, action.BodyParameters, action.RequestMethod)
.ExecuteRequestAsync<dynamic>(); .ExecuteRequestAsync<dynamic>();
} }

View File

@@ -53,6 +53,10 @@ namespace Untappd.Net.Responses.Actions
get { return _shout; } get { return _shout; }
set set
{ {
if (value == null)
{
throw new ArgumentNullException("value");
}
if (value.Length > 140) if (value.Length > 140)
{ {
throw new ArgumentOutOfRangeException("value", value,"Shout can be no more than 140 characters"); throw new ArgumentOutOfRangeException("value", value,"Shout can be no more than 140 characters");

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -30,10 +30,6 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="RestSharp"> <Reference Include="RestSharp">
<HintPath>..\..\packages\RestSharp.105.0.1\lib\net4\RestSharp.dll</HintPath> <HintPath>..\..\packages\RestSharp.105.0.1\lib\net4\RestSharp.dll</HintPath>
</Reference> </Reference>
@@ -44,6 +40,9 @@
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Newtonsoft.Json">
<HintPath>..\..\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="OAuth\AuthenticationHelper.cs" /> <Compile Include="OAuth\AuthenticationHelper.cs" />