Skip to content

Instantly share code, notes, and snippets.

@bronumski
bronumski / TypeExtensions.cs
Created November 3, 2023 16:13
Type extensions
static class TypeExtensions
{
public static IEnumerable<Type> GetInstanceTypesImplementing<T>(
this Assembly assembly, params Assembly[] assemblies)
{
var serviceType = typeof(T);
return assemblies.Union(new [] { assembly }).SelectMany(x => x.GetTypes())
.Where( x => x.IsClass && !x.IsAbstract && serviceType.IsAssignableFrom( x ) );
}
@bronumski
bronumski / InterpolatedStringHandler.cs
Last active May 4, 2022 17:25
Using `InterpolatedStringHandler` to support writing safe structured log messages
logger.LogInformation($"We can now do this {someCode}");
logger.LogInformation($"And this {1 + 1:Calculated}");
logger.LogInformation($"And also this {() => ExpensiveMethodCall(TimeSpan.FromSeconds(1)):Expensive}");
logger.LogInformation($"And not worry about {UnsafeMethodCall:Unsafe}");
logger.LogTrace($"And not have to check if the log level is enabled {() => ExpensiveMethodCall(TimeSpan.FromSeconds(10)):Expensive}");
@bronumski
bronumski / BufferedTextWriterSink.cs
Created November 3, 2021 20:06
BufferedTextWriterSink
class BufferedTextWriterSink : ILogEventSink, IDisposable
{
private readonly LogEventLevel? standardErrorFromLevel;
private readonly ITextFormatter formatter;
private readonly object _syncRoot = new();
private readonly TextWriter standardWriter;
private readonly TextWriter errorWriter;
private readonly ConcurrentBag<LogEvent> logEvents = new();
/// <summary>
/// <see cref="DelegatingHandler"/> that can be used to capture the actual outbound request and the returned
/// response. These are logged by default to the console but can also be routed to an action. This can be useful
/// for tests that use a <see cref="HttpClient"/> to call a fake service.
/// </summary>
/// <example>
/// new HttpClient(new LoggingDelegatingHandler(new HttpClientHandler()));
/// </example>
public class LoggingDelegatingHandler : DelegatingHandler
{
@bronumski
bronumski / BitbucketStaleBranchChecker.fs
Created October 28, 2020 23:34
Trawls bitbucket repositories looking for stale branches and pull requests.
open System
open System.Text
open FSharp.Data
open FSharp.Json
let (username, password) = ("username", "password")
let repositoryRootUrl = "https://api.bitbucket.org/2.0/repositories/team_workspace"
let repositories = [ "RepoA"; "RepoB" ]
let lookBack = DateTime.Now.AddDays(-1.0)
let maxOutdatedToTake = 10
@bronumski
bronumski / SpecsForController.cs
Created August 21, 2020 03:28
ASP.NET MVC 5 Unit Testing
abstract class SpecsForController<TSut, TResult> where TSut : ControllerBase where TResult : ActionResult
{
private readonly NSubstituteMockingKernel kernel = new NSubstituteMockingKernel();
private TSut Subject { get; set; }
protected TResult Result { get; private set; }
protected HttpContextBase HttpContext => Subject.ControllerContext.HttpContext;
protected virtual void Arrange(ControllerContext context) { }
protected abstract Expression<Action<TSut>> Act { get; }
protected TService ResolveDependency<TService>() => kernel.Get<TService>();
protected void RegisterDependency<TDependency>(TDependency dependency)
@bronumski
bronumski / dotcover.sh
Created August 17, 2020 17:02
Run dotcover command line against .net core test
# Mac
../dotcover/dotCover.sh cover --output=./bin/<project coverage>.html --reportType=HTML --TargetExecutable=/usr/local/share/dotnet/dotnet -- test ./<project>/<project>.UnitTests/
@bronumski
bronumski / Test.cs
Last active August 5, 2020 00:07
TestServer
private TestServer CreateTestServer() =>
new TestServer(new WebHostBuilder()
.UseStartup<FakeStartup>());
class FakeStartup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Run(async ctx =>
{
@bronumski
bronumski / stock.fsx
Created May 20, 2020 04:37
Technical test to get the aggregated stock results for a given symbol, originally done in C# but I tried it out in F#
#r @"./packages/fsharp-data/netstandard2.0/Fsharp.Data.dll"
#r @"./packages/newtonsoft.json/netstandard2.0/Newtonsoft.Json.dll"
open System
open FSharp.Data
open Newtonsoft.Json.Linq
let timeSeriesUrl = "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=%s&outputsize=full&apikey=A3U8E3F7N3A85K86"
type TimeSeries = FSharp.Data.JsonProvider<"""{
"2. high": "123.4567",
@bronumski
bronumski / Program.cs
Last active March 15, 2018 20:51
C# Functional Try Catch Finally
public static int Main(string[] args) =>
Try
.Action(() => 0)
.WithCatch<Exception>(ex => 1})
.Finally(CleanUpMethod);