Skip to content

Commit

Permalink
firming up the new diagnostic extensibility pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremydmiller committed Jul 3, 2014
1 parent d1d4fbc commit bd2ac81
Show file tree
Hide file tree
Showing 32 changed files with 373 additions and 272 deletions.
1 change: 1 addition & 0 deletions .bottle-alias
Expand Up @@ -5,5 +5,6 @@
<alias name="pak1" folder="src/TestPackage1" />
<alias name="pak2" folder="src/TestPackage2" />
<alias name="fubumvc" folder="FubuMVC.Diagnostics" />
<alias name="fubumvc.structuremap" folder="src/FubuMVC.StructureMap" />
</Aliases>
</aliases>
1 change: 1 addition & 0 deletions rakefile.rb
Expand Up @@ -16,6 +16,7 @@
sln.bottles_enabled = false # has to be all special in FubuMVC because of the zip package testing

sln.assembly_bottle 'FubuMVC.Diagnostics'
sln.assembly_bottle 'FubuMVC.StructureMap'

sln.integration_test = ['FubuMVC.IntegrationTesting']
sln.ci_steps = [:integration_test, :archive_gem]
Expand Down
Expand Up @@ -24,7 +24,7 @@ public void Add(RoutedChain chain)
if (chain.RouteName.IsEmpty()) throw new ArgumentOutOfRangeException("chain.RouteName");

var method = chain.Route.AllowedHttpMethods.FirstOrDefault();
if (method == null) throw new ArgumentOutOfRangeException("chain", "Must have at least one HTTP method constraint specified");
if (method == null) throw new ArgumentOutOfRangeException("chain", "Must have at least one HTTP method constraint specified, url: " + chain.GetRoutePattern());

_routes.Add(new JavascriptRoute
{
Expand Down
18 changes: 12 additions & 6 deletions src/FubuMVC.Core/Diagnostics/DiagnosticChain.cs
Expand Up @@ -11,35 +11,41 @@ public class DiagnosticChain : RoutedChain
{
public const string DiagnosticsUrl = "_fubu";

public static IRouteDefinition BuildRoute(DiagnosticGroup group, ActionCall call)
public static IRouteDefinition BuildRoute(ActionCall call)
{
var prefix = call.HandlerType.Name.Replace("FubuDiagnostics", "").ToLower();

if (call.Method.Name == "Index")
{
return new RouteDefinition("{0}/{1}".ToFormat(DiagnosticsUrl, group.Url).TrimEnd('/'));
return new RouteDefinition("{0}/{1}".ToFormat(DiagnosticsUrl, prefix).TrimEnd('/'));
}

var route = call.ToRouteDefinition();
MethodToUrlBuilder.Alter(route, call);
route.Prepend(@group.Url);
route.Prepend(prefix);
route.Prepend(DiagnosticsUrl);

return route;
}

public DiagnosticChain(DiagnosticGroup group, ActionCall call) : base(BuildRoute(group, call))
public DiagnosticChain(ActionCall call) : base(BuildRoute(call))
{
if (call.HasInput)
{
Route.ApplyInputType(call.InputType());
}

RouteName = call.HandlerType.Name.Replace("FubuDiagnostics", "")
+ ":"
+ call.Method.Name.Replace("get_", "").Replace("post_", "").Replace("{", "").Replace("}", "");

AddToEnd(call);
}

public static DiagnosticChain For<T>(DiagnosticGroup group, Expression<Action<T>> method)
public static DiagnosticChain For<T>(Expression<Action<T>> method)
{
var call = ActionCall.For(method);
return new DiagnosticChain(group, call);
return new DiagnosticChain(call);
}
}
}
40 changes: 0 additions & 40 deletions src/FubuMVC.Core/Diagnostics/DiagnosticGroup.cs

This file was deleted.

27 changes: 0 additions & 27 deletions src/FubuMVC.Core/DiagnosticsSettings.cs
Expand Up @@ -49,36 +49,9 @@ public void SetIfNone(TraceLevel level)
}
}

public IList<DiagnosticGroup> Groups = new List<DiagnosticGroup>();

public DiagnosticJavascriptRoutes ToJavascriptRoutes()
{
var routes = new DiagnosticJavascriptRoutes();
Groups.SelectMany(x => x.Chains()).Each(routes.Add);

return routes;
}

public IEnumerable<string> Stylesheets()
{
return Groups.SelectMany(x => x.Stylesheets);
}

public IEnumerable<string> Scripts()
{
return Groups.SelectMany(x => x.Scripts);
}

public IEnumerable<string> ReactFiles()
{
return Groups.SelectMany(x => x.ReactFiles);
}
}

public class DiagnosticJavascriptRoutes : JavascriptRouter
{

}

public enum TraceLevel
{
Expand Down
1 change: 0 additions & 1 deletion src/FubuMVC.Core/FubuMVC.Core.csproj
Expand Up @@ -117,7 +117,6 @@
<Compile Include="Diagnostics\DescriptionPropertyTag.cs" />
<Compile Include="Diagnostics\DescriptionBodyTag.cs" />
<Compile Include="Diagnostics\DiagnosticChain.cs" />
<Compile Include="Diagnostics\DiagnosticGroup.cs" />
<Compile Include="Diagnostics\Runtime\ApplyTracing.cs" />
<Compile Include="Diagnostics\Runtime\BehaviorFinish.cs" />
<Compile Include="Diagnostics\Runtime\BehaviorStart.cs" />
Expand Down
Expand Up @@ -71,7 +71,11 @@ private void injectContent(IDictionary<string, object> environment, MemoryStream
var html = recordedStream.ReadAllText();
var builder = new StringBuilder(html);
var position = html.IndexOf("</head>", 0, StringComparison.OrdinalIgnoreCase);
builder.Insert(position, _options.Content(environment));

if (position >= 0)
{
builder.Insert(position, _options.Content(environment));
}

response.Write(builder.ToString());
response.Flush();
Expand Down
2 changes: 1 addition & 1 deletion src/FubuMVC.Core/Runtime/MimeType.cs
Expand Up @@ -241,7 +241,7 @@ static MimeType()
{".jpeg", "image/jpeg"},
{".jpg", "image/jpeg"},
{".js", "application/javascript"},
{".jsx", "text/jscript"},
{".jsx", "text/jsx"},
{".latex", "application/x-latex"},
{".lit", "application/x-ms-reader"},
{".lpk", "application/octet-stream"},
Expand Down
84 changes: 84 additions & 0 deletions src/FubuMVC.Diagnostics.Tests/Bootstrapping_Integration_Testing.cs
@@ -0,0 +1,84 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using FubuMVC.Core;
using FubuMVC.Core.Assets;
using FubuMVC.Core.Registration.Nodes;
using FubuMVC.Diagnostics.ModelBinding;
using FubuMVC.StructureMap;
using FubuTestingSupport;
using NUnit.Framework;

namespace FubuMVC.Diagnostics.Tests
{
[TestFixture]
public class Bootstrapping_Integration_Testing
{
private FubuRuntime runtime;
private DashboardModel model;

[TestFixtureSetUp]
public void SetUp()
{
runtime = FubuApplication.DefaultPolicies().StructureMap().Bootstrap();

model = runtime.Factory.Get<FubuDiagnosticsEndpoint>().get__fubu();
}

[TestFixtureTearDown]
public void TearDown()
{
runtime.Dispose();
}

[Test]
public void find_the_routes_and_chains_from_bottles()
{
runtime.Behaviors.BehaviorFor<StructureMapFubuDiagnostics>(x => x.get_plugin_types())
.ShouldNotBeNull();

runtime.Behaviors.BehaviorFor<ModelBindingFubuDiagnostics>(x => x.get_binding_all())
.ShouldNotBeNull();
}

[Test]
public void builds_partials_for_Visualize_methods()
{
var chain = runtime.Behaviors.BehaviorFor<ModelBindingFubuDiagnostics>(x => x.VisualizePartial(null));

chain.GetType().ShouldEqual(typeof (BehaviorChain));

chain.IsPartialOnly.ShouldBeTrue();
}

[Test]
public void got_all_the_routes_in_the_diagnostic_javascript_router()
{
var routes = runtime.Factory.Get<DiagnosticJavascriptRoutes>();
var names = routes.Routes().Select(x => x.Name).ToArray();

names.ShouldContain("StructureMap:plugin_types");
names.ShouldContain("Chain:chain_Id");
names.ShouldContain("Requests:requests");
}

[Test]
public void build_styles()
{
model.StyleTags.ToString()
.ShouldContain("<link href=\"/fubu-diagnostics/structuremap.css\" rel=\"stylesheet\" type=\"text/css\" />");
}

[Test]
public void build_scripts()
{
model.ScriptTags.ToString().ShouldContain("<script type=\"text/javascript\" src=\"/fubu-diagnostics/structuremap.js\"></script>");
}

[Test, Explicit("not reliable in CI, but works fine otherwise. Not gonna worry about it")]
public void build_rsx_files()
{
model.ReactTags.ToString().ShouldContain("<script type=\"text/jsx\" src=\"/fubu-diagnostics/structuremap.jsx\"></script>");
}
}
}
Expand Up @@ -93,6 +93,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="apply_authorization_rights_to_all_diagnostics_pages.cs" />
<Compile Include="Bootstrapping_Integration_Testing.cs" />
<Compile Include="Chains\ChainVisualizationTester.cs" />
<Compile Include="debugging.cs" />
<Compile Include="DiagnosticSettings_TraceLevel_Registration_Tester.cs" />
Expand Down
Expand Up @@ -7,6 +7,7 @@
using FubuCore.Reflection;
using FubuMVC.Core.Diagnostics.Runtime;
using FubuMVC.Core.UI.Bootstrap.Collapsibles;
using FubuMVC.Diagnostics.ModelBinding;
using FubuMVC.Diagnostics.Visualization.Visualizers;
using NUnit.Framework;
using FubuTestingSupport;
Expand All @@ -29,7 +30,7 @@ public void SetUp()
[Test]
public void just_show_the_selected_model_binder_if_no_properties()
{
var tag = new ModelBindingLogEndpoint().VisualizePartial(theLog).As<CollapsibleTag>();
var tag = new ModelBindingFubuDiagnostics(null).VisualizePartial(theLog).As<CollapsibleTag>();

tag.ToString().ShouldContain("Used Title of FakeModelBinder");
}
Expand All @@ -40,7 +41,7 @@ public void show_with_properties()
theLog.Report.AddProperty(ReflectionHelper.GetProperty<FakeModel>(x => x.Name), new ConversionPropertyBinder(new BindingRegistry()));
theLog.Report.Used(new BindingValue{RawKey = "somethingelse", RawValue = "raw", Source = "the request"});

var tag = new ModelBindingLogEndpoint().VisualizePartial(theLog).As<CollapsibleTag>();
var tag = new ModelBindingFubuDiagnostics(null).VisualizePartial(theLog).As<CollapsibleTag>();
tag.ToString().ShouldContain("<tr><td>Name</td><td>ConversionPropertyBinder</td><td>&#39;raw&#39; from &#39;the request&#39;/somethingelse</td></tr>");
}
}
Expand Down
17 changes: 0 additions & 17 deletions src/FubuMVC.Diagnostics/CoreDiagnosticsGroup.cs

This file was deleted.

2 changes: 2 additions & 0 deletions src/FubuMVC.Diagnostics/Dashboard.spark
Expand Up @@ -124,7 +124,9 @@
<Script src="diagnostics/screens.js"/>
<Script src="diagnostics/fubu-diagnostics.js"/>
!{Model.Router}
<Script src="diagnostics/core-diagnostics.js"/>
!{Model.ScriptTags}
<script src="/diagnostics/navigation-react.jsx" type="text/jsx"/>
!{Model.ReactTags}
</body>
</html>
Expand Down
30 changes: 26 additions & 4 deletions src/FubuMVC.Diagnostics/DiagnosticChainsSource.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Linq;
using FubuMVC.Core;
using Bottles;
using FubuCore;
using FubuMVC.Core.Diagnostics;
using FubuMVC.Core.Registration;
using FubuMVC.Core.Registration.Nodes;

Expand All @@ -10,9 +11,30 @@ public class DiagnosticChainsSource : IChainSource
{
public IEnumerable<BehaviorChain> BuildChains(BehaviorGraph graph)
{
var settings = graph.Settings.Get<DiagnosticsSettings>();
foreach (var action in findActions())
{
if (action.Method.Name.StartsWith("Visualize"))
{
var chain = new BehaviorChain();
chain.AddToEnd(action);
chain.IsPartialOnly = true;
yield return chain;
}
else
{
yield return new DiagnosticChain(action);
}
}
}

private IEnumerable<ActionCall> findActions()
{
var source = new ActionSource();

PackageRegistry.PackageAssemblies.Each(a => source.Applies.ToAssembly(a));
source.IncludeTypesNamed(name => name.EndsWith("FubuDiagnostics"));

return settings.Groups.SelectMany(x => x.Chains()).ToArray();
return source.As<IActionSource>().FindActions(null);
}
}
}
6 changes: 6 additions & 0 deletions src/FubuMVC.Diagnostics/DiagnosticsRegistration.cs
@@ -1,7 +1,9 @@
using FubuCore.Binding.InMemory;
using FubuCore.Logging;
using FubuMVC.Core;
using FubuMVC.Core.Assets;
using FubuMVC.Core.Diagnostics.Runtime;
using FubuMVC.Core.Runtime;

namespace FubuMVC.Diagnostics
{
Expand All @@ -11,8 +13,12 @@ public class DiagnosticsRegistration : IFubuRegistryExtension

public void Configure(FubuRegistry registry)
{
MimeType.New("text/jsx", ".jsx");

registry.Services<DiagnosticServiceRegistry>();

registry.AlterSettings<AssetSettings>(x => x.AllowableExtensions.Add(".jsx"));

registry.AlterSettings<DiagnosticsSettings>(x =>
{
x.TraceLevel = TraceLevel.Verbose;
Expand Down

0 comments on commit bd2ac81

Please sign in to comment.