Merge pull request #41 from tparnell8/master

Release minor fix to event race conditions. Add CLS support
This commit is contained in:
Tommy Parnell
2015-06-19 21:25:46 -05:00
38 changed files with 401 additions and 87 deletions

5
.gitignore vendored
View File

@@ -9,7 +9,8 @@
*.DotSettings *.DotSettings
# User-specific files (MonoDevelop/Xamarin Studio) # User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs *.userprefs
*.lock
tools/
**/.settings **/.settings
NDependOut NDependOut
*.ndproj *.ndproj
@@ -24,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>

10
.travis.yml Normal file
View File

@@ -0,0 +1,10 @@
language: csharp
solution: Untappd.Net.sln
script:
- xbuild /p:Configuration=Release Untappd.Net.sln
- mono ./packages/NUnit.Runners.*/tools/nunit-console.exe ./src/*Tests/bin/Release/*Tests.dll
sudo: false
script:
- gem install bundle
- bundle
- rake preflight

5
Gemfile Normal file
View File

@@ -0,0 +1,5 @@
source 'http://rubygems.org'
gem 'rake'
gem 'os'
gem 'albacore'
gem 'nokogiri'

View File

@@ -1,5 +1,11 @@
**Master:** [![Build status](https://ci.appveyor.com/api/projects/status/e21297waldfrso3p/branch/master?svg=true)](https://ci.appveyor.com/project/tparnell8/untappd-net/branch/master) **Master AppVeyor Build (Windows):** [![Build status](https://ci.appveyor.com/api/projects/status/e21297waldfrso3p/branch/master?svg=true)](https://ci.appveyor.com/project/tparnell8/untappd-net/branch/master)
**Master Travis-CI (Linux):** [![Build Status](https://travis-ci.org/tparnell8/Untappd.Net.svg?branch=master)](https://travis-ci.org/tparnell8/Untappd.Net)
**Master Circle-CI (Linux):** [![Circle CI](https://circleci.com/gh/tparnell8/Untappd.Net/tree/master.svg?style=svg)](https://circleci.com/gh/tparnell8/Untappd.Net/tree/master)
**Release:**[![Build status](https://ci.appveyor.com/api/projects/status/e21297waldfrso3p/branch/Release?svg=true)](https://ci.appveyor.com/project/tparnell8/untappd-net/branch/Release) **Release:**[![Build status](https://ci.appveyor.com/api/projects/status/e21297waldfrso3p/branch/Release?svg=true)](https://ci.appveyor.com/project/tparnell8/untappd-net/branch/Release)
**Code Coverage:** [![Coverage Status](https://coveralls.io/repos/tparnell8/Untappd.Net/badge.svg?branch=master)](https://coveralls.io/r/tparnell8/Untappd.Net?branch=master) **Code Coverage:** [![Coverage Status](https://coveralls.io/repos/tparnell8/Untappd.Net/badge.svg?branch=master)](https://coveralls.io/r/tparnell8/Untappd.Net?branch=master)
**Kanban** [![Stories in Ready](https://badge.waffle.io/tparnell8/untappd.net.png?label=ready&title=Ready)](https://waffle.io/tparnell8/untappd.net) **Kanban** [![Stories in Ready](https://badge.waffle.io/tparnell8/untappd.net.png?label=ready&title=Ready)](https://waffle.io/tparnell8/untappd.net)
@@ -10,6 +16,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.

69
Rakefile Normal file
View File

@@ -0,0 +1,69 @@
require 'bundler/setup'
require 'rake/clean'
require 'albacore'
require 'open-uri'
require 'fileutils'
require 'os'
require 'nokogiri'
import 'assets/tools.rake'
PACKAGES = File.expand_path("packages")
TOOLS = File.expand_path("tools")
NUGET = File.expand_path("#{TOOLS}/nuget")
Configuration = ENV['CONFIGURATION'] || 'Release'
desc 'retrieve dependencies'
task :retrieve => ['tools:nuget_fetch']
desc 'build the project'
task :build => [:compile]
desc 'Run the tests'
task :test => [:nunit]
desc 'Retrieve, Build, Test'
task :preflight => [:retrieve, :build, :test, :cs_lint]
build :compile => ['tools:nuget_fetch'] do |b|
b.prop 'Configuration', Configuration
b.sln = 'Untappd.Net.sln'
end
test_runner :nunit do |tests|
tests.files = FileList["src/**/*UnitTests/bin/#{Configuration}/*UnitTests.dll"] # dll files with test
tests.exe = "packages/NUnit.Runners.2.6.4/tools/nunit-console.exe" # executable to run tests with
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 --console"
end
# task :tests => :'tests:unit'
#task :ensure_nuget_key do
# raise 'missing env NUGET_KEY value' unless ENV['NUGET_KEY']
#end
#Albacore::Tasks::Release.new :release,
# pkg_dir: 'build/pkg',
# depend_on: [:create_nugets, :ensure_nuget_key],
# nuget_exe: 'packages/NuGet.CommandLine/tools/NuGet.exe',
# api_key: ENV['NUGET_KEY']

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

@@ -25,6 +25,9 @@ build:
after_test: after_test:
- packages\OpenCover.4.5.3723\OpenCover.Console.exe -register:user -filter:"+[Untappd.Net*]* -[*Tests]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/noshadow /domain:single src\Untappd.Net.UnitTests\bin\Release\Untappd.Net.UnitTests.dll" -output:coverage.xml - packages\OpenCover.4.5.3723\OpenCover.Console.exe -register:user -filter:"+[Untappd.Net*]* -[*Tests]*" -target:"packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -targetargs:"/noshadow /domain:single src\Untappd.Net.UnitTests\bin\Release\Untappd.Net.UnitTests.dll" -output:coverage.xml
- packages\coveralls.io.1.3.4\tools\coveralls.net.exe --opencover coverage.xml - packages\coveralls.io.1.3.4\tools\coveralls.net.exe --opencover coverage.xml
- gem install bundle
- bundle
- rake cs_lint
deploy: deploy:
- provider: NuGet - provider: NuGet
server: server:
@@ -38,3 +41,6 @@ deploy:
secure: wsN6BzH8ETiXhB9SndP57mHhivqM+CVnghI/+w5XE3bI8K092Z4V4FrJixcrxKnI secure: wsN6BzH8ETiXhB9SndP57mHhivqM+CVnghI/+w5XE3bI8K092Z4V4FrJixcrxKnI
on: on:
branch: release branch: release
artifacts:
path: output/gendarme.html
name: gendarme

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
A: Untappd.Net
# 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

12
assets/puppet/init.pp Normal file
View File

@@ -0,0 +1,12 @@
include apt
class mono {
package { "mono-devel" :
ensure => "installed"
}
package { "mono-gmcs" :
ensure => "installed"
}
package { "mono-vbnc" :
ensure => "installed"
}
}

3
assets/puppet/site.pp Normal file
View File

@@ -0,0 +1,3 @@
import 'init.pp'
include mono

37
assets/tools.rake Normal file
View File

@@ -0,0 +1,37 @@
namespace :tools do
# If we don't have a copy of nuget, download it
task :nuget_bootstrap do
puts 'Ensuring NuGet exists in tools/NuGet'
if !FileTest.exist?("#{NUGET}/nuget.exe")
puts 'Downloading nuget from nuget.org'
FileUtils.mkdir_p("#{NUGET}")
File.open("#{NUGET}/nuget.exe", "wb") do |file|
file.write open('https://nuget.org/nuget.exe').read
end
end
end
# Fetch nuget dependencies for all packages
task :nuget_fetch => :nuget_bootstrap do
# If we aren't running under windows, assume we're using mono
CMD_PREFIX = ""
if !OS.windows?
CMD_PREFIX = "mono"
begin
sh "mozroots --import --sync" #attempt to sync ssl things...
rescue
end
end
# Make sure we get solution-level deps
sh "#{CMD_PREFIX} #{NUGET}/nuget.exe i .nuget/packages.config -o packages"
FileList["src/**/packages.config"].each { |filepath|
sh "#{CMD_PREFIX} #{NUGET}/nuget.exe i #{filepath} -o packages"
}
end
end

6
circle.yml Normal file
View File

@@ -0,0 +1,6 @@
dependencies:
pre:
- sudo apt-get update; sudo apt-get install mono-devel
test:
override:
- rake preflight

View File

@@ -2,7 +2,7 @@
using NUnit.Framework; using NUnit.Framework;
using Untappd.Net.Authentication; using Untappd.Net.Authentication;
namespace Untappd.Net.UnitTests.Client namespace Untappd.Net.UnitTests.Authentication
{ {
[TestFixture] [TestFixture]
public class TestAuthenticatedUntappdCredentials public class TestAuthenticatedUntappdCredentials

View File

@@ -2,7 +2,7 @@
using NUnit.Framework; using NUnit.Framework;
using Untappd.Net.Authentication; using Untappd.Net.Authentication;
namespace Untappd.Net.UnitTests.Client namespace Untappd.Net.UnitTests.Authentication
{ {
[TestFixture] [TestFixture]
public class TestUnAuthenticatedUntappdCredentials public class TestUnAuthenticatedUntappdCredentials

View File

@@ -1,6 +1,5 @@
using NUnit.Framework; using NUnit.Framework;
using Untappd.Net.Exception; using Untappd.Net.Exception;
namespace Untappd.Net.UnitTests.Exception namespace Untappd.Net.UnitTests.Exception
{ {
[TestFixture] [TestFixture]
@@ -24,5 +23,7 @@ namespace Untappd.Net.UnitTests.Exception
{ {
throw new BaseUntappdException("messageHere", new System.Exception("innerException!")); throw new BaseUntappdException("messageHere", new System.Exception("innerException!"));
} }
} }
} }

View File

@@ -31,7 +31,7 @@ namespace Untappd.Net.UnitTests.Request
request.Setup(a => a.AddParameter(It.IsAny<string>(), It.IsAny<string>())); request.Setup(a => a.AddParameter(It.IsAny<string>(), It.IsAny<string>()));
var response = new Mock<IRestResponse>(); var response = new Mock<IRestResponse>();
response.Setup(a => a.Content).Returns(File.ReadAllText("../../Responses/json/BeerInfo.json")); response.Setup(a => a.Content).Returns(File.ReadAllText("../../Responses/Json/BeerInfo.json"));
client.Setup(a => a.Execute(It.IsAny<IRestRequest>())).Callback(() => client.Setup(a => a.Execute(It.IsAny<IRestRequest>())).Callback(() =>
{ {
}).Returns(response.Object); }).Returns(response.Object);

View File

@@ -18,7 +18,7 @@ using Untappd.Net.Responses.VenueInfo;
using UserDistinctBeers = Untappd.Net.Responses.UserDistinctBeer; using UserDistinctBeers = Untappd.Net.Responses.UserDistinctBeer;
using UserWishList = Untappd.Net.Responses.UserWishlist; using UserWishList = Untappd.Net.Responses.UserWishlist;
namespace Untappd.Net.UnitTests namespace Untappd.Net.UnitTests.Responses
{ {
[TestFixture] [TestFixture]
public class TestDeserializer public class TestDeserializer

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,14 +59,20 @@
<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" />
<Compile Include="Responses\Actions\TestSimpleActions.cs" /> <Compile Include="Responses\Actions\TestSimpleActions.cs" />
<Compile Include="Responses\TestDeserializer.cs" /> <Compile Include="Responses\TestDeserializer.cs" />
<Compile Include="Authentication\TestAuthenticationHelper.cs" /> <Compile Include="Authentication\TestAuthenticationHelper.cs" />
<Compile Include="Client\TestAuthenticatedUntappdCredentials.cs" /> <Compile Include="Authentication\TestAuthenticatedUntappdCredentials.cs" />
<Compile Include="Client\TestUnAuthenticatedUntappdCredentials.cs" /> <Compile Include="Authentication\TestUnAuthenticatedUntappdCredentials.cs" />
<Compile Include="Exception\TestBaseUntappdException.cs" /> <Compile Include="Exception\TestBaseUntappdException.cs" />
<Compile Include="Exception\TestEndpointConfigurationException.cs" /> <Compile Include="Exception\TestEndpointConfigurationException.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.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

@@ -4,7 +4,7 @@ namespace Untappd.Net.Request
{ {
public abstract class BasicRequest public abstract class BasicRequest
{ {
protected abstract string _EndPoint { get; } protected abstract string EndPointWithConfiguration { get; }
/// <summary> /// <summary>
/// Pass in the parameter into the request...ie username, brewery, etc. /// Pass in the parameter into the request...ie username, brewery, etc.
/// </summary> /// </summary>
@@ -15,9 +15,9 @@ namespace Untappd.Net.Request
if (!String.IsNullOrEmpty(parameter)) if (!String.IsNullOrEmpty(parameter))
{ {
parameter = string.Format("/{0}", parameter); parameter = string.Format("/{0}", parameter);
return string.Format(_EndPoint, parameter); return string.Format(EndPointWithConfiguration, parameter);
} }
return string.Format(_EndPoint, string.Empty); return string.Format(EndPointWithConfiguration, string.Empty);
} }
} }
} }

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

@@ -937,7 +937,7 @@ namespace Untappd.Net.Responses.BeerInfo
public class BeerInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class BeerInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/beer/info{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/beer/info{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -258,7 +258,7 @@ namespace Untappd.Net.Responses.BeerSearch
public class BeerSearch : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class BeerSearch : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/search/beer"; } } protected override string EndPointWithConfiguration { get { return "v4/search/beer"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -908,7 +908,7 @@ namespace Untappd.Net.Responses.BreweryInfo
public class BreweryInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class BreweryInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/brewery/info{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/brewery/info{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -146,7 +146,7 @@ namespace Untappd.Net.Responses.BrewerySearch
public class BrewerySearch : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class BrewerySearch : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/search/brewery"; } } protected override string EndPointWithConfiguration { get { return "v4/search/brewery"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -511,7 +511,7 @@ namespace Untappd.Net.Responses.Feeds.ActivityFeed
public class ActivityFeed : BasicRequest, IAuthenticatedRequest public class ActivityFeed : BasicRequest, IAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "/v4/checkin/recent"; } } protected override string EndPointWithConfiguration { get { return "/v4/checkin/recent"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -478,7 +478,7 @@ namespace Untappd.Net.Responses.Feeds.UserActivityFeed
public class UserActivityFeed : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class UserActivityFeed : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/user/checkins{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/user/checkins{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -207,7 +207,7 @@ namespace Untappd.Net.Responses.UserBadges
/// </summary> /// </summary>
public class UserBadges : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class UserBadges : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/user/badges{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/user/badges{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -225,7 +225,7 @@ namespace Untappd.Net.Responses.UserDistinctBeer
public class UserDistinctBeers : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class UserDistinctBeers : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/user/beers{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/user/beers{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -136,7 +136,7 @@ namespace Untappd.Net.Responses.UserFriends
public class UserFriends : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class UserFriends : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/user/friends{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/user/friends{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -1099,7 +1099,7 @@ namespace Untappd.Net.Responses.UserInfo
public class UserInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class UserInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/user/info{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/user/info{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -217,7 +217,7 @@ namespace Untappd.Net.Responses.UserWishlist
public class UserWishList : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class UserWishList : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "/v4/user/wishlist{0}"; } } protected override string EndPointWithConfiguration { get { return "/v4/user/wishlist{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

View File

@@ -1193,7 +1193,7 @@ namespace Untappd.Net.Responses.VenueInfo
public class VenueInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest public class VenueInfo : BasicRequest, IAuthenticatedRequest, IUnAuthenticatedRequest
{ {
protected override string _EndPoint { get { return "v4/venue/info{0}"; } } protected override string EndPointWithConfiguration { get { return "v4/venue/info{0}"; } }
[JsonProperty("meta")] [JsonProperty("meta")]
public Meta Meta { get; set; } public Meta Meta { get; set; }

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" />