Skip to content

Commit

Permalink
Setting configuration based on config.yaml.
Browse files Browse the repository at this point in the history
  • Loading branch information
dragan committed Jul 8, 2012
1 parent 42f8085 commit b5d37ad
Show file tree
Hide file tree
Showing 14 changed files with 353 additions and 74 deletions.
2 changes: 1 addition & 1 deletion src/Mulder.Base/Compilation/Compiler.cs
Expand Up @@ -25,7 +25,7 @@ public Compiler(ILog log, IFileSystem fileSystem, IFilterFactory filterFactory)

public void Compile(Site site)
{
string outputDirectory = site.Configuration["OutputDirectory"].ToString();
string outputDirectory = site.Configuration.OutputDirectory;
fileSystem.CreateDirectory(outputDirectory);

CreateStaticFiles(site);
Expand Down
6 changes: 3 additions & 3 deletions src/Mulder.Base/DataSources/FileSystemUnified.cs
Expand Up @@ -19,14 +19,14 @@ public class FileSystemUnified : IDataSource

readonly ILog log;
readonly IFileSystem fileSystem;
readonly IDictionary<string, object> configuration;
readonly IConfiguration configuration;
readonly Regex identifierCleanerRegex;

public FileSystemUnified(ILog log, IFileSystem fileSystem) : this(log, fileSystem, null)
{
}

public FileSystemUnified(ILog log, IFileSystem fileSystem, IDictionary<string, object> configuration)
public FileSystemUnified(ILog log, IFileSystem fileSystem, IConfiguration configuration)
{
this.log = log;
this.fileSystem = fileSystem;
Expand Down Expand Up @@ -228,7 +228,7 @@ string BuildFileName(string fileBaseName, string extension)
bool IsBinary(string fileName)
{
string extensionWithoutDot = Path.GetExtension(fileName).Substring(1);
string[] textExtensions = configuration["TextExtensions"] as string[];
IEnumerable<string> textExtensions = configuration.TextExtensions;
return !textExtensions.Contains(extensionWithoutDot);
}

Expand Down
247 changes: 247 additions & 0 deletions src/Mulder.Base/Domain/Configuration.cs
@@ -0,0 +1,247 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

using Mulder.Base.DataSources;

namespace Mulder.Base.Domain
{
public class Configuration : IConfiguration
{
readonly Dictionary<string, object> internalDictionary;
readonly string outputDirectory = "public";
readonly IEnumerable<string> textExtensions;
readonly IEnumerable<string> indexFileNames;
readonly List<DataSourceMeta> dataSourceMetas;

public string OutputDirectory
{
get { return outputDirectory; }
}

public IEnumerable<string> TextExtensions
{
get { return textExtensions; }
}

public IEnumerable<string> IndexFileNames
{
get { return indexFileNames; }
}

public IEnumerable<DataSourceMeta> DataSourceMetas
{
get { return dataSourceMetas; }
}

public Configuration(IDictionary<string, object> dictionary)
{
internalDictionary = new Dictionary<string, object>(dictionary);

// Set defaults
textExtensions = new [] { "htm", "html", "css", "liquid", "js", "less", "markdown", "md", "text", "xhtml", "xml" };

indexFileNames = new [] { "index.html" };

dataSourceMetas = new List<DataSourceMeta> {
new DataSourceMeta { Type = "filesystem_unified", ItemsRoot = "/", LayoutsRoot = "/" }
};

// Set based off config if values are supplied
if (this.ContainsKey("output_directory"))
outputDirectory = this["output_directory"].ToString();

if (this.ContainsKey("text_extensions"))
textExtensions = ((List<object>)this["text_extensions"]).Select(i => i.ToString()).ToList();

if (this.ContainsKey("index_filenames"))
indexFileNames = ((List<object>)this["index_filenames"]).Select(i => i.ToString()).ToList();

if (this.ContainsKey("data_sources")) {
dataSourceMetas.Clear();
var dataSources = (List<object>)this["data_sources"];

foreach (var dataSource in dataSources) {
var meta = (IDictionary<string, object>)dataSource;
string type = meta["type"].ToString();
string itemsRoot = meta["items_root"].ToString();
string layoutsRoot = meta["layouts_root"].ToString();

dataSourceMetas.Add(new DataSourceMeta { Type = type, ItemsRoot = itemsRoot, LayoutsRoot = layoutsRoot });
}
}
}

object GetValue(string key)
{
if (internalDictionary.ContainsKey(key))
return internalDictionary[key];

throw new KeyNotFoundException();
}

// IDictionary<string, object> implementation
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
{
return internalDictionary.GetEnumerator();
}

public void Remove(object key)
{
((IDictionary) internalDictionary).Remove(key);
}

public void Add(KeyValuePair<string, object> item)
{
((IDictionary<string, object>) internalDictionary).Add(item);
}

public void Add(object key, object value)
{
((IDictionary) internalDictionary).Add(key, value);
}

public bool Contains(object key)
{
return ((IDictionary) internalDictionary).Contains(key);
}

public bool Contains(KeyValuePair<string, object> item)
{
return ((IDictionary<string, object>) internalDictionary).Contains(item);
}

public void Clear()
{
internalDictionary.Clear();
}

public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
{
((IDictionary<string, object>) internalDictionary).CopyTo(array, arrayIndex);
}

public bool Remove(KeyValuePair<string, object> item)
{
return ((IDictionary<string, object>) internalDictionary).Remove(item);
}

object IDictionary.this[object key]
{
get
{
if (!(key is string))
throw new NotSupportedException();

return GetValue((string)key);
}
set
{
((IDictionary) internalDictionary)[key] = value;
}
}

IEnumerator IEnumerable.GetEnumerator()
{
return internalDictionary.GetEnumerator();
}

IDictionaryEnumerator IDictionary.GetEnumerator()
{
return ((IDictionary) internalDictionary).GetEnumerator();
}

// IDictionary implementation
public int Count
{
get { return internalDictionary.Count; }
}

public object SyncRoot
{
get { return ((IDictionary) internalDictionary).SyncRoot; }
}

public bool IsSynchronized
{
get { return ((IDictionary) internalDictionary).IsSynchronized; }
}

public bool IsReadOnly
{
get { return ((IDictionary) internalDictionary).IsReadOnly; }
}

public bool IsFixedSize
{
get { return ((IDictionary) internalDictionary).IsFixedSize; }
}

public object this[string key]
{
get { return GetValue(key); }
set { internalDictionary[key] = value; }
}

public ICollection<string> Keys
{
get { return internalDictionary.Keys; }
}

public ICollection<object> Values
{
get { return internalDictionary.Values; }
}

public void CopyTo(Array array, int index)
{
((IDictionary) internalDictionary).CopyTo(array, index);
}

public bool ContainsKey(string key)
{
return internalDictionary.ContainsKey(key);
}

public void Add(string key, object value)
{
internalDictionary.Add(key, value);
}

public bool Remove(string key)
{
return internalDictionary.Remove(key);
}

public bool TryGetValue(string key, out object value)
{
return internalDictionary.TryGetValue(key, out value);
}

ICollection IDictionary.Values
{
get { return ((IDictionary) internalDictionary).Values; }
}

ICollection IDictionary.Keys
{
get { return ((IDictionary) internalDictionary).Keys; }
}
}

public interface IConfiguration : IDictionary<string, object>, IDictionary
{
string OutputDirectory { get; }
IEnumerable<string> TextExtensions { get; }
IEnumerable<string> IndexFileNames { get; }
IEnumerable<DataSourceMeta> DataSourceMetas { get; }
}

public class DataSourceMeta
{
public string Type { get; set; }
public string ItemsRoot { get; set; }
public string LayoutsRoot { get; set; }
}
}
6 changes: 3 additions & 3 deletions src/Mulder.Base/Domain/Site.cs
Expand Up @@ -7,21 +7,21 @@ namespace Mulder.Base.Domain
{
public class Site : IEquatable<Site>
{
readonly IDictionary<string, object> configuration;
readonly IConfiguration configuration;
readonly IEnumerable<Item> items;
readonly IEnumerable<Layout> layouts;
readonly IEnumerable<CompileRule> compileRules;
readonly IEnumerable<RouteRule> routeRules;
readonly IEnumerable<LayoutRule> layoutRules;

public IDictionary<string, object> Configuration { get { return configuration; } }
public IConfiguration Configuration { get { return configuration; } }
public IEnumerable<Item> Items { get { return items; } }
public IEnumerable<Layout> Layouts { get { return layouts; } }
public IEnumerable<CompileRule> CompileRules { get { return compileRules; } }
public IEnumerable<RouteRule> RouteRules { get { return routeRules; } }
public IEnumerable<LayoutRule> LayoutRules { get { return layoutRules; } }

public Site(IDictionary<string, object> configuration, IEnumerable<Item> items, IEnumerable<Layout> layouts, IEnumerable<CompileRule> compileRules, IEnumerable<RouteRule> routeRules, IEnumerable<LayoutRule> layoutRules)
public Site(IConfiguration configuration, IEnumerable<Item> items, IEnumerable<Layout> layouts, IEnumerable<CompileRule> compileRules, IEnumerable<RouteRule> routeRules, IEnumerable<LayoutRule> layoutRules)
{
this.configuration = configuration;
this.items = items;
Expand Down
59 changes: 19 additions & 40 deletions src/Mulder.Base/Loading/Loader.cs
Expand Up @@ -7,6 +7,7 @@

using Mulder.Base.DataSources;
using Mulder.Base.Domain;
using Mulder.Base.Extensions;
using Mulder.Base.IO;
using Mulder.Base.Logging;

Expand All @@ -26,47 +27,32 @@ public Loader(ILog log, IFileSystem fileSystem)
public Site LoadSiteData()
{
var configuration = LoadConfiguration();

var dataSources = new List<IDataSource> {
new FileSystemUnified(log, fileSystem, configuration)
};

var dataSources = new List<IDataSource>();
foreach (var dataSourceMeta in configuration.DataSourceMetas) {
if (dataSourceMeta.Type == "filesystem_unified")
dataSources.Add(new FileSystemUnified(log, fileSystem, configuration));

// TODO: Instantiate and add other data sources based on configuration
}

var items = LoadItems(dataSources);
var layouts = LoadLayouts(dataSources);
var rules = LoadRules();

return new Site(configuration, items, layouts, rules.CompileRules, rules.RouteRules, rules.LayoutRules);
}

// TODO: Modify to load config.yaml file
IDictionary<string, object> LoadConfiguration()

IConfiguration LoadConfiguration()
{
var configuration = new Dictionary<string, object> {
{
"OutputDirectory",
"public"
},
{
"TextExtensions",
new [] {
"htm", "html", "css", "liquid", "js", "less", "markdown", "md", "text", "xhtml", "xml"
}
},
{
"IndexFilenames",
new [] {
"index.html"
}
},
{
"DataSources",
new List<DataSourceInfo> {
new DataSourceInfo { Type = "filesystem_unified", ItemsRoot = "/", LayoutsRoot = "/" }
}
}
};

return configuration;
// TODO: Error handling when loading configuration fails
if (fileSystem.FileExists("config.yaml")) {
string yaml = fileSystem.ReadStringFromFile("config.yaml");
var deserializedYaml = yaml.DeserializeYaml()[0] as IDictionary<string, object>;
return new Configuration(deserializedYaml);
}

return new Configuration(new Dictionary<string, object>());
}

IList<Item> LoadItems(IEnumerable<IDataSource> dataSources)
Expand Down Expand Up @@ -117,13 +103,6 @@ Rules LoadRules()
};
}

class DataSourceInfo
{
public string Type { get; set; }
public string ItemsRoot { get; set; }
public string LayoutsRoot { get; set; }
}

class Rules
{
public IEnumerable<CompileRule> CompileRules { get; set; }
Expand Down

0 comments on commit b5d37ad

Please sign in to comment.