<commit_before>Fluency.NET
===========
Fluency is a framework for building fluent interfaces or DSLs in .NET. It simplifies building fluent interfaces for configuration, but also has facilities for creating interfaces to build anonymous (random) test data for integration tests.

There are two ways to use Fluency.

1. Use the standard dynamic builder by creating of instance of DynamicFluentBuilder<T> where T is the target type to build.
2. Use a custom builder by subclassing FluentBuilder<T> and creating the methods/properties you want in your fluent interface.

Using the Dynamic Builder
-------------------------
The simplest way to use Fluency it to use the dynamic builder.

###Target Class
	public class MyConfiguration
	{
	    public string UserName { get; set; }
	    public bool AllowLogin { get; set; }
	    public int TimeoutMinutes { get; set; }
	}

###Code to use the builder
	MyConfiguration config = 
	    new DynamicFluentBuilder<MyConfiguration>()
	        .For( x => x.UserName, "Bob" )
	        .With( x => x.AllowLogin, true )
	        .Having( x => x.TimeoutMinutes, 5 )
	        .build();
	<commit_msg>Added more detail to README.markdown<commit_after>Fluency.NET
===========
Fluency is a framework for building fluent interfaces or DSLs in .NET. It simplifies building fluent interfaces for configuration, but also has facilities for creating interfaces to build anonymous (random) test data for integration tests.

There are two ways to use Fluency.

1. Use the standard dynamic builder by creating of instance of DynamicFluentBuilder<T> where T is the target type to build.
2. Use a custom builder by subclassing FluentBuilder<T> and creating the methods/properties you want in your fluent interface.

Examples
--------
Let's say you want a fluent interface to build the follwing configuration class.

	public class MyConfiguration
	{
	    public string UserName { get; set; }
	    public bool AllowLogin { get; set; }
	    public int TimeoutMinutes { get; set; }
	}

###Using the dynamic builder
This is the simplest way to use Fluency. You simply (1) instantiate `DynamicFluentBuilder<T>` for your type, then (2) call the lambda-based config methods to set the values, and finally (3) call build() to build the resulting config.
	MyConfiguration config = 
	    new DynamicFluentBuilder<MyConfiguration>()
	        .For( x => x.UserName, "Bob" )
	        .With( x => x.AllowLogin, true )
	        .Having( x => x.TimeoutMinutes, 5 )
	        .build();

###Using a custom builder
Using a custom builder gives you full control of the fluent interface. To create a custom builder, you need to subclass `FluentBuilder<T>` and implement your fluent interface.
	public class MyConfigurationBuilder : FluentBuilder< MyConfiguration >
	{
	    public MyConfigurationBuilder ForUser( string userName )
		{
			SetProperty( x => x.UserName, userName );
			return this;
		}
		
		public MyConfigurationBuilder IsAllowedToLogin()
		{
			SetProperty( x => x.AllowLogin, true );
			return this;
		}
		
		public MyConfigurationBuilder IsNotAllowedToLogin()
		{
			SetProperty( x => x.AllowLogin, false );
			return this;
		}
		
		public MyConfigurationBuilder MinutesBeforeTimeout( int timeoutMinutes )
		{
			SetProperty( x => x.TimeoutMinutes, timeoutMinutes );
			return this;
		}
	}

And here is how you would use the builder.
	MyConfiguration config =
		new MyConfigurationBuilder()
			.ForUser( "Bob" )
			.AllowedToLogin()
			.MinutesBeforeTimeout( 20 )
			.build();

While the custom builder requires more work to create, it gives you much more control over the interface. It also doesn't require the user of the interface to know the structure of the class being built (because we aren't using lambdas).
	
{'fraction_non_alphanumeric': 0.0821256038647343, 'fraction_numerical': 0.0029522275899087494, 'mean_word_length': 3.595561035758323, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 22, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6461316', 'n_tokens_mistral': 1078, 'n_tokens_neox': 967, 'n_words': 450}