Merge pull request #6935 from umbraco/v8/feature/AB3289-MB-allow-legacy
Allow legacy Models Builder to continue to work if detected
This commit is contained in:
@@ -52,17 +52,17 @@
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.dll" target="lib\net472\Umbraco.Web.dll" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.UI.dll" target="lib\net472\Umbraco.Web.UI.dll" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.Examine.dll" target="lib\net472\Umbraco.Examine.dll" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.ModelsBuilder.dll" target="lib\net472\Umbraco.ModelsBuilder.dll" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.ModelsBuilder.Embedded.dll" target="lib\net472\Umbraco.ModelsBuilder.Embedded.dll" />
|
||||
|
||||
<!-- docs -->
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.xml" target="lib\net472\Umbraco.Web.xml" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.Web.UI.xml" target="lib\net472\Umbraco.Web.UI.xml" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.Examine.xml" target="lib\net472\Umbraco.Examine.xml" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.ModelsBuilder.xml" target="lib\net472\Umbraco.ModelsBuilder.xml" />
|
||||
<file src="$BuildTmp$\WebApp\bin\Umbraco.ModelsBuilder.Embedded.xml" target="lib\net472\Umbraco.ModelsBuilder.Embedded.xml" />
|
||||
|
||||
<!-- symbols -->
|
||||
<file src="$BuildTmp$\bin\Umbraco.Web.pdb" target="lib\net472\Umbraco.Web.pdb" />
|
||||
<file src="$BuildTmp$\bin\Umbraco.Examine.pdb" target="lib\net472\Umbraco.Examine.pdb" />
|
||||
<file src="$BuildTmp$\bin\Umbraco.ModelsBuilder.pdb" target="lib\net472\Umbraco.ModelsBuilder.pdb" />
|
||||
<file src="$BuildTmp$\bin\Umbraco.ModelsBuilder.Embedded.pdb" target="lib\net472\Umbraco.ModelsBuilder.Embedded.pdb" />
|
||||
</files>
|
||||
</package>
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
<file src="$BuildTmp$\WebApp\Global.asax" target="Content\Global.asax" />
|
||||
<file src="$BuildTmp$\WebApp\config\BackOfficeTours\**" target="Content\Config\BackOfficeTours" />
|
||||
<file src="$BuildTmp$\WebApp\Media\Web.config" target="Content\Media\Web.config" />
|
||||
<file src="$BuildTmp$\WebApp\App_Plugins\UmbModelsBuilder\**" target="Content\App_Plugins\UmbModelsBuilder" />
|
||||
|
||||
<!-- these files are copied by install.ps1 -->
|
||||
<file src="$BuildTmp$\WebApp\Web.config" target="UmbracoFiles\Web.config" />
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<appSettings xdt:Transform="InsertIfMissing" />
|
||||
<appSettings>
|
||||
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
|
||||
<add key="Umbraco.ModelsBuilder.Enable" value="false" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
|
||||
<add key="Umbraco.ModelsBuilder.ModelsMode" value="Nothing" xdt:Locator="Match(key)" xdt:Transform="InsertIfMissing" />
|
||||
</appSettings>
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
[assembly: AssemblyCompany("Umbraco")]
|
||||
[assembly: AssemblyCopyright("Copyright © Umbraco 2019")]
|
||||
@@ -21,5 +20,3 @@ using System.Runtime.CompilerServices;
|
||||
// these are FYI and changed automatically
|
||||
[assembly: AssemblyFileVersion("8.3.0")]
|
||||
[assembly: AssemblyInformationalVersion("8.3.0")]
|
||||
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests")]
|
||||
|
||||
@@ -14,7 +14,7 @@ using System.Runtime.InteropServices;
|
||||
[assembly: InternalsVisibleTo("Umbraco.Web")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Web.UI")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Examine")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.ModelsBuilder")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.ModelsBuilder.Embedded")]
|
||||
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests.Benchmarks")]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
using System.Reflection;
|
||||
using Semver;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
/// <summary>
|
||||
/// Manages API version handshake between client and server.
|
||||
@@ -0,0 +1,17 @@
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Embedded.BackOffice
|
||||
{
|
||||
/// <summary>
|
||||
/// Used to validate the aliases for the content type when MB is enabled to ensure that
|
||||
/// no illegal aliases are used
|
||||
/// </summary>
|
||||
// ReSharper disable once UnusedMember.Global - This is typed scanned
|
||||
public class ContentTypeModelValidator : ContentTypeModelValidatorBase<DocumentTypeSave, PropertyTypeBasic>
|
||||
{
|
||||
public ContentTypeModelValidator(IModelsBuilderConfig config) : base(config)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,41 +2,29 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Editors;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.BackOffice
|
||||
namespace Umbraco.ModelsBuilder.Embedded.BackOffice
|
||||
{
|
||||
/// <summary>
|
||||
/// Used to validate the aliases for the content type when MB is enabled to ensure that
|
||||
/// no illegal aliases are used
|
||||
/// </summary>
|
||||
public class ContentTypeModelValidator : ContentTypeModelValidatorBase<DocumentTypeSave, PropertyTypeBasic>
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Used to validate the aliases for the content type when MB is enabled to ensure that
|
||||
/// no illegal aliases are used
|
||||
/// </summary>
|
||||
public class MediaTypeModelValidator : ContentTypeModelValidatorBase<MediaTypeSave, PropertyTypeBasic>
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Used to validate the aliases for the content type when MB is enabled to ensure that
|
||||
/// no illegal aliases are used
|
||||
/// </summary>
|
||||
public class MemberTypeModelValidator : ContentTypeModelValidatorBase<MemberTypeSave, MemberPropertyTypeBasic>
|
||||
{ }
|
||||
|
||||
public abstract class ContentTypeModelValidatorBase<TModel, TProperty> : EditorValidator<TModel>
|
||||
where TModel : ContentTypeSave<TProperty>
|
||||
where TProperty : PropertyTypeBasic
|
||||
{
|
||||
private readonly IModelsBuilderConfig _config;
|
||||
|
||||
public ContentTypeModelValidatorBase(IModelsBuilderConfig config)
|
||||
{
|
||||
_config = config;
|
||||
}
|
||||
|
||||
protected override IEnumerable<ValidationResult> Validate(TModel model)
|
||||
{
|
||||
//don't do anything if we're not enabled
|
||||
if (!_config.Enable) yield break;
|
||||
|
||||
var properties = model.Groups.SelectMany(x => x.Properties)
|
||||
.Where(x => x.Inherited == false)
|
||||
.ToArray();
|
||||
@@ -48,7 +36,7 @@ namespace Umbraco.ModelsBuilder.BackOffice
|
||||
if (model.Alias.ToLowerInvariant() == prop.Alias.ToLowerInvariant())
|
||||
yield return new ValidationResult(string.Format("With Models Builder enabled, you can't have a property with a the alias \"{0}\" when the content type alias is also \"{0}\".", prop.Alias), new[]
|
||||
{
|
||||
string.Format("Groups[{0}].Properties[{1}].Alias", model.Groups.IndexOf(propertyGroup), propertyGroup.Properties.IndexOf(prop))
|
||||
$"Groups[{model.Groups.IndexOf(propertyGroup)}].Properties[{propertyGroup.Properties.IndexOf(prop)}].Alias"
|
||||
});
|
||||
|
||||
//we need to return the field name with an index so it's wired up correctly
|
||||
@@ -72,9 +60,9 @@ namespace Umbraco.ModelsBuilder.BackOffice
|
||||
|
||||
if (reservedProperties.InvariantContains(alias) || reservedMethods.InvariantContains(alias))
|
||||
return new ValidationResult(
|
||||
string.Format("The alias {0} is a reserved term and cannot be used", alias), new[]
|
||||
$"The alias {alias} is a reserved term and cannot be used", new[]
|
||||
{
|
||||
string.Format("Groups[{0}].Properties[{1}].Alias", groupIndex, propertyIndex)
|
||||
$"Groups[{groupIndex}].Properties[{propertyIndex}].Alias"
|
||||
});
|
||||
|
||||
return null;
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Text;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.BackOffice
|
||||
namespace Umbraco.ModelsBuilder.Embedded.BackOffice
|
||||
{
|
||||
internal class DashboardReport
|
||||
{
|
||||
@@ -24,6 +24,9 @@ namespace Umbraco.ModelsBuilder.BackOffice
|
||||
|
||||
public string Text()
|
||||
{
|
||||
if (!_config.Enable)
|
||||
return "Version: " + ApiVersion.Current.Version + "<br /> <br />ModelsBuilder is disabled<br />(the .Enable key is missing, or its value is not 'true').";
|
||||
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.Append("Version: ");
|
||||
@@ -0,0 +1,17 @@
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Embedded.BackOffice
|
||||
{
|
||||
/// <summary>
|
||||
/// Used to validate the aliases for the content type when MB is enabled to ensure that
|
||||
/// no illegal aliases are used
|
||||
/// </summary>
|
||||
// ReSharper disable once UnusedMember.Global - This is typed scanned
|
||||
public class MediaTypeModelValidator : ContentTypeModelValidatorBase<MediaTypeSave, PropertyTypeBasic>
|
||||
{
|
||||
public MediaTypeModelValidator(IModelsBuilderConfig config) : base(config)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Models.ContentEditing;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Embedded.BackOffice
|
||||
{
|
||||
/// <summary>
|
||||
/// Used to validate the aliases for the content type when MB is enabled to ensure that
|
||||
/// no illegal aliases are used
|
||||
/// </summary>
|
||||
// ReSharper disable once UnusedMember.Global - This is typed scanned
|
||||
public class MemberTypeModelValidator : ContentTypeModelValidatorBase<MemberTypeSave, MemberPropertyTypeBasic>
|
||||
{
|
||||
public MemberTypeModelValidator(IModelsBuilderConfig config) : base(config)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,12 +4,12 @@ using System.Net.Http;
|
||||
using System.Runtime.Serialization;
|
||||
using System.Web.Hosting;
|
||||
using Umbraco.Core.Exceptions;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Editors;
|
||||
using Umbraco.Web.WebApi.Filters;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.BackOffice
|
||||
namespace Umbraco.ModelsBuilder.Embedded.BackOffice
|
||||
{
|
||||
/// <summary>
|
||||
/// API controller for use in the Umbraco back office with Angular resources
|
||||
@@ -20,7 +20,7 @@ namespace Umbraco.ModelsBuilder.BackOffice
|
||||
/// global WebApi formatters being changed since this is always forced to only return Angular JSON Specific formats.
|
||||
/// </remarks>
|
||||
[UmbracoApplicationAuthorize(Core.Constants.Applications.Settings)]
|
||||
public class ModelsBuilderBackOfficeController : UmbracoAuthorizedJsonController
|
||||
public class ModelsBuilderDashboardController : UmbracoAuthorizedJsonController
|
||||
{
|
||||
private readonly IModelsBuilderConfig _config;
|
||||
private readonly ModelsGenerator _modelGenerator;
|
||||
@@ -28,7 +28,7 @@ namespace Umbraco.ModelsBuilder.BackOffice
|
||||
private readonly ModelsGenerationError _mbErrors;
|
||||
private readonly DashboardReport _dashboardReport;
|
||||
|
||||
public ModelsBuilderBackOfficeController(IModelsBuilderConfig config, ModelsGenerator modelsGenerator, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors)
|
||||
public ModelsBuilderDashboardController(IModelsBuilderConfig config, ModelsGenerator modelsGenerator, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors)
|
||||
{
|
||||
//_umbracoServices = umbracoServices;
|
||||
_config = config;
|
||||
@@ -97,7 +97,7 @@ namespace Umbraco.ModelsBuilder.BackOffice
|
||||
{
|
||||
return new Dashboard
|
||||
{
|
||||
Enable = true,
|
||||
Enable = _config.Enable,
|
||||
Text = _dashboardReport.Text(),
|
||||
CanGenerate = _dashboardReport.CanGenerate(),
|
||||
OutOfDateModels = _dashboardReport.AreModelsOutOfDate(),
|
||||
@@ -1,9 +1,9 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
// NOTE
|
||||
// The idea was to have different types of builder, because I wanted to experiment with
|
||||
@@ -32,7 +32,7 @@ namespace Umbraco.ModelsBuilder.Building
|
||||
"Umbraco.Core.Models",
|
||||
"Umbraco.Core.Models.PublishedContent",
|
||||
"Umbraco.Web",
|
||||
"Umbraco.ModelsBuilder"
|
||||
"Umbraco.ModelsBuilder.Embedded"
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
@@ -65,8 +65,8 @@ namespace Umbraco.ModelsBuilder.Building
|
||||
/// Initializes a new instance of the <see cref="Builder"/> class with a list of models to generate,
|
||||
/// the result of code parsing, and a models namespace.
|
||||
/// </summary>
|
||||
/// <param name="config"></param>
|
||||
/// <param name="typeModels">The list of models to generate.</param>
|
||||
/// <param name="modelsNamespace">The models namespace.</param>
|
||||
protected Builder(IModelsBuilderConfig config, IList<TypeModel> typeModels)
|
||||
{
|
||||
_typeModels = typeModels ?? throw new ArgumentNullException(nameof(typeModels));
|
||||
@@ -1,8 +1,8 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
public class ModelsGenerator
|
||||
{
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a model property.
|
||||
@@ -3,9 +3,9 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements a builder that works by writing text.
|
||||
@@ -16,7 +16,6 @@ namespace Umbraco.ModelsBuilder.Building
|
||||
/// Initializes a new instance of the <see cref="TextBuilder"/> class with a list of models to generate
|
||||
/// and the result of code parsing.
|
||||
/// </summary>
|
||||
/// <param name="config"></param>
|
||||
/// <param name="typeModels">The list of models to generate.</param>
|
||||
public TextBuilder(IModelsBuilderConfig config, IList<TypeModel> typeModels)
|
||||
: base(config, typeModels)
|
||||
@@ -1,6 +1,6 @@
|
||||
using System.Text;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
internal static class TextHeaderWriter
|
||||
{
|
||||
@@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a model.
|
||||
@@ -1,7 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Building
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Building
|
||||
{
|
||||
internal class TypeModelHasher
|
||||
{
|
||||
@@ -35,6 +35,9 @@ namespace Umbraco.ModelsBuilder.Building
|
||||
}
|
||||
}
|
||||
|
||||
// Include the MB version in the hash so that if the MB version changes, models are rebuilt
|
||||
hash.Add(ApiVersion.Current.Version.ToString());
|
||||
|
||||
return hash.GetCombinedHashCode();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core.Manifest;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Compose
|
||||
{
|
||||
/// <summary>
|
||||
/// Removes the built in embedded models builder manifest from being loaded
|
||||
/// </summary>
|
||||
internal class DisableModelsBuilderManifestFilter : IManifestFilter
|
||||
{
|
||||
public void Filter(List<PackageManifest> manifests)
|
||||
{
|
||||
manifests.RemoveAll(x => x.Source.EndsWith("App_Plugins\\UmbModelsBuilder\\package.manifest", StringComparison.InvariantCultureIgnoreCase));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.ModelsBuilder.Embedded.BackOffice;
|
||||
using Umbraco.Web.Features;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Compose
|
||||
{
|
||||
/// <summary>
|
||||
/// Special component used for when MB is disabled with the legacy MB is detected
|
||||
/// </summary>
|
||||
internal class DisabledModelsBuilderComponent : IComponent
|
||||
{
|
||||
private readonly UmbracoFeatures _features;
|
||||
|
||||
public DisabledModelsBuilderComponent(UmbracoFeatures features)
|
||||
{
|
||||
_features = features;
|
||||
}
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
//disable the embedded dashboard controller
|
||||
_features.Disabled.Controllers.Add<ModelsBuilderDashboardController>();
|
||||
}
|
||||
|
||||
public void Terminate()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,15 +8,16 @@ using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.IO;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Services.Implement;
|
||||
using Umbraco.ModelsBuilder.BackOffice;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.BackOffice;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.Web.JavaScript;
|
||||
using Umbraco.Web.Mvc;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Compose
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Compose
|
||||
{
|
||||
public class ModelsBuilderComponent : IComponent
|
||||
|
||||
internal class ModelsBuilderComponent : IComponent
|
||||
{
|
||||
|
||||
private readonly IModelsBuilderConfig _config;
|
||||
@@ -38,7 +39,8 @@ namespace Umbraco.ModelsBuilder.Compose
|
||||
|
||||
ContentModelBinder.ModelBindingException += ContentModelBinder_ModelBindingException;
|
||||
|
||||
FileService.SavingTemplate += FileService_SavingTemplate;
|
||||
if (_config.Enable)
|
||||
FileService.SavingTemplate += FileService_SavingTemplate;
|
||||
|
||||
if (_config.ModelsMode.IsLiveNotPure())
|
||||
_liveModelsProvider.Install();
|
||||
@@ -71,7 +73,7 @@ namespace Umbraco.ModelsBuilder.Compose
|
||||
if (HttpContext.Current == null) throw new InvalidOperationException("HttpContext is null");
|
||||
var urlHelper = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()));
|
||||
|
||||
umbracoUrls["modelsBuilderBaseUrl"] = urlHelper.GetUmbracoApiServiceBaseUrl<ModelsBuilderBackOfficeController>(controller => controller.BuildModels());
|
||||
umbracoUrls["modelsBuilderBaseUrl"] = urlHelper.GetUmbracoApiServiceBaseUrl<ModelsBuilderDashboardController>(controller => controller.BuildModels());
|
||||
umbracoPlugins["modelsBuilder"] = GetModelsBuilderSettings();
|
||||
};
|
||||
}
|
||||
@@ -80,7 +82,7 @@ namespace Umbraco.ModelsBuilder.Compose
|
||||
{
|
||||
var settings = new Dictionary<string, object>
|
||||
{
|
||||
{"enabled", true}
|
||||
{"enabled", _config.Enable}
|
||||
};
|
||||
|
||||
return settings;
|
||||
@@ -1,21 +1,33 @@
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.PublishedCache.NuCache;
|
||||
using Umbraco.Web.Features;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Compose
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Compose
|
||||
{
|
||||
|
||||
|
||||
[ComposeBefore(typeof(NuCacheComposer))]
|
||||
[RuntimeLevel(MinLevel = RuntimeLevel.Run)]
|
||||
public sealed class ModelsBuilderComposer : ComponentComposer<ModelsBuilderComponent>, ICoreComposer
|
||||
public sealed class ModelsBuilderComposer : ICoreComposer
|
||||
{
|
||||
public override void Compose(Composition composition)
|
||||
public void Compose(Composition composition)
|
||||
{
|
||||
base.Compose(composition);
|
||||
var isLegacyModelsBuilderInstalled = IsLegacyModelsBuilderInstalled();
|
||||
|
||||
if (isLegacyModelsBuilderInstalled)
|
||||
{
|
||||
ComposeForLegacyModelsBuilder(composition);
|
||||
return;
|
||||
}
|
||||
|
||||
composition.Components().Append<ModelsBuilderComponent>();
|
||||
composition.Register<UmbracoServices>(Lifetime.Singleton);
|
||||
composition.Configs.Add<IModelsBuilderConfig>(() => new ModelsBuilderConfig());
|
||||
composition.RegisterUnique<ModelsGenerator>();
|
||||
@@ -29,6 +41,28 @@ namespace Umbraco.ModelsBuilder.Compose
|
||||
ComposeForDefaultModelsFactory(composition);
|
||||
}
|
||||
|
||||
private static bool IsLegacyModelsBuilderInstalled()
|
||||
{
|
||||
Assembly legacyMbAssembly = null;
|
||||
try
|
||||
{
|
||||
legacyMbAssembly = Assembly.Load("Umbraco.ModelsBuilder");
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
//swallow exception, DLL must not be there
|
||||
}
|
||||
|
||||
return legacyMbAssembly != null;
|
||||
}
|
||||
|
||||
private void ComposeForLegacyModelsBuilder(Composition composition)
|
||||
{
|
||||
composition.Logger.Info<ModelsBuilderComposer>("ModelsBuilder.Embedded is disabled, the legacy ModelsBuilder was detected.");
|
||||
composition.Components().Append<DisabledModelsBuilderComponent>();
|
||||
composition.ManifestFilters().Append<DisableModelsBuilderManifestFilter>();
|
||||
}
|
||||
|
||||
private void ComposeForDefaultModelsFactory(Composition composition)
|
||||
{
|
||||
composition.RegisterUnique<IPublishedModelFactory>(factory =>
|
||||
@@ -1,10 +1,10 @@
|
||||
using System.Web;
|
||||
using System.Web.Compilation;
|
||||
using Umbraco.ModelsBuilder.Compose;
|
||||
using Umbraco.ModelsBuilder.Embedded.Compose;
|
||||
|
||||
[assembly: PreApplicationStartMethod(typeof(ModelsBuilderInitializer), "Initialize")]
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Compose
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Compose
|
||||
{
|
||||
public static class ModelsBuilderInitializer
|
||||
{
|
||||
@@ -1,7 +1,7 @@
|
||||
using Umbraco.Core.Configuration;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides extension methods for the <see cref="Configs"/> class.
|
||||
@@ -1,7 +1,8 @@
|
||||
namespace Umbraco.ModelsBuilder.Configuration
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Configuration
|
||||
{
|
||||
public interface IModelsBuilderConfig
|
||||
{
|
||||
bool Enable { get; }
|
||||
bool AcceptUnsafeModelsDirectory { get; }
|
||||
int DebugLevel { get; }
|
||||
bool EnableFactory { get; }
|
||||
@@ -5,7 +5,7 @@ using System.Web.Configuration;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.IO;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Configuration
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Configuration
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents the models builder configuration.
|
||||
@@ -22,11 +22,18 @@ namespace Umbraco.ModelsBuilder.Configuration
|
||||
{
|
||||
const string prefix = "Umbraco.ModelsBuilder.";
|
||||
|
||||
// giant kill switch, default: false
|
||||
// must be explicitely set to true for anything else to happen
|
||||
Enable = ConfigurationManager.AppSettings[prefix + "Enable"] == "true";
|
||||
|
||||
// ensure defaults are initialized for tests
|
||||
ModelsNamespace = DefaultModelsNamespace;
|
||||
ModelsDirectory = IOHelper.MapPath(DefaultModelsDirectory);
|
||||
DebugLevel = 0;
|
||||
|
||||
// stop here, everything is false
|
||||
if (!Enable) return;
|
||||
|
||||
// mode
|
||||
var modelsMode = ConfigurationManager.AppSettings[prefix + "ModelsMode"];
|
||||
if (!string.IsNullOrWhiteSpace(modelsMode))
|
||||
@@ -94,6 +101,7 @@ namespace Umbraco.ModelsBuilder.Configuration
|
||||
/// Initializes a new instance of the <see cref="ModelsBuilderConfig"/> class.
|
||||
/// </summary>
|
||||
public ModelsBuilderConfig(
|
||||
bool enable = false,
|
||||
ModelsMode modelsMode = ModelsMode.Nothing,
|
||||
string modelsNamespace = null,
|
||||
bool enableFactory = true,
|
||||
@@ -102,6 +110,7 @@ namespace Umbraco.ModelsBuilder.Configuration
|
||||
bool acceptUnsafeModelsDirectory = false,
|
||||
int debugLevel = 0)
|
||||
{
|
||||
Enable = enable;
|
||||
ModelsMode = modelsMode;
|
||||
|
||||
ModelsNamespace = string.IsNullOrWhiteSpace(modelsNamespace) ? DefaultModelsNamespace : modelsNamespace;
|
||||
@@ -143,6 +152,15 @@ namespace Umbraco.ModelsBuilder.Configuration
|
||||
throw new ConfigurationErrorsException($"Invalid models directory \"{config}\".");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether the whole models experience is enabled.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>If this is false then absolutely nothing happens.</para>
|
||||
/// <para>Default value is <c>false</c> which means that unless we have this setting, nothing happens.</para>
|
||||
/// </remarks>
|
||||
public bool Enable { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the models mode.
|
||||
/// </summary>
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Umbraco.ModelsBuilder.Configuration
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Configuration
|
||||
{
|
||||
/// <summary>
|
||||
/// Defines the models generation modes.
|
||||
@@ -8,7 +8,7 @@
|
||||
/// <summary>
|
||||
/// Do not generate models.
|
||||
/// </summary>
|
||||
Nothing = 0, // default value //TODO: This doesn't make sense since we cannot actualy disable MB since Umbraco would die
|
||||
Nothing = 0, // default value
|
||||
|
||||
/// <summary>
|
||||
/// Generate models in memory.
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace Umbraco.ModelsBuilder.Configuration
|
||||
namespace Umbraco.ModelsBuilder.Embedded.Configuration
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides extensions for the <see cref="ModelsMode"/> enumeration.
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
// because, of course, it's internal in Umbraco
|
||||
// see also System.Web.Util.HashCodeCombiner
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicates that a property implements a given property alias.
|
||||
@@ -2,11 +2,11 @@
|
||||
using System.Threading;
|
||||
using System.Web.Hosting;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Cache;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
// supports LiveAppData - but not PureLive
|
||||
public sealed class LiveModelsProvider
|
||||
@@ -2,12 +2,12 @@
|
||||
using System.Web;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.ModelsBuilder;
|
||||
using Umbraco.ModelsBuilder.Embedded;
|
||||
|
||||
// will install only if configuration says it needs to be installed
|
||||
[assembly: PreApplicationStartMethod(typeof(LiveModelsProviderModule), "Install")]
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
// have to do this because it's the only way to subscribe to EndRequest,
|
||||
// module is installed by assembly attribute at the top of this file
|
||||
@@ -27,7 +27,7 @@ namespace Umbraco.ModelsBuilder
|
||||
|
||||
// here we're using "Current." since we're in a module, it is possible in a round about way to inject into a module but for now we'll just use Current
|
||||
if (_liveModelsProvider == null)
|
||||
_liveModelsProvider = Current.Factory.TryGetInstance<LiveModelsProvider>(); // will be null in upgrade mode
|
||||
_liveModelsProvider = Current.Factory.TryGetInstance<LiveModelsProvider>(); // will be null in upgrade mode or if embedded MB is disabled
|
||||
|
||||
if (_liveModelsProvider?.IsEnabled ?? false)
|
||||
_liveModelsProvider.GenerateModelsIfRequested(sender, e);
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
/// <summary>
|
||||
/// Indicates that an Assembly is a Models Builder assembly.
|
||||
@@ -1,9 +1,9 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
public sealed class ModelsGenerationError
|
||||
{
|
||||
@@ -1,8 +1,8 @@
|
||||
using System.IO;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using Umbraco.Web.Cache;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
public sealed class OutOfDateModelsStatus
|
||||
{
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
[assembly: AssemblyTitle("Umbraco.ModelsBuilder")]
|
||||
@@ -8,3 +9,5 @@ using System.Runtime.InteropServices;
|
||||
|
||||
[assembly: ComVisible(false)]
|
||||
[assembly: Guid("52ac0ba8-a60e-4e36-897b-e8b97a54ed1c")]
|
||||
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests")]
|
||||
@@ -3,6 +3,7 @@ using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.ModelsBuilder;
|
||||
using Umbraco.ModelsBuilder.Embedded;
|
||||
|
||||
// same namespace as original Umbraco.Web PublishedElementExtensions
|
||||
// ReSharper disable once CheckNamespace
|
||||
@@ -1,10 +1,10 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using Umbraco.Web.Composing;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.Web.Composing;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
/// <summary>
|
||||
/// This is called from within the generated model classes
|
||||
@@ -15,11 +15,11 @@ using System.Web.WebPages.Razor;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Logging;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
using File = System.IO.File;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
internal class PureLiveModelFactory : ILivePublishedModelFactory, IRegisteredObject
|
||||
{
|
||||
@@ -6,7 +6,7 @@ using System.Web.Compilation;
|
||||
using System.Web.Hosting;
|
||||
using Umbraco.Core;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
internal static class ReferencedAssemblies
|
||||
{
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
internal static class TypeExtensions
|
||||
{
|
||||
@@ -7,8 +7,8 @@
|
||||
<ProjectGuid>{52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Umbraco.ModelsBuilder</RootNamespace>
|
||||
<AssemblyName>Umbraco.ModelsBuilder</AssemblyName>
|
||||
<RootNamespace>Umbraco.ModelsBuilder.Embedded</RootNamespace>
|
||||
<AssemblyName>Umbraco.ModelsBuilder.Embedded</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
@@ -30,7 +30,7 @@
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Release\Umbraco.ModelsBuilder.xml</DocumentationFile>
|
||||
<DocumentationFile>bin\Release\Umbraco.ModelsBuilder.Embedded.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
@@ -50,11 +50,16 @@
|
||||
<Link>Properties\SolutionInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="ApiVersion.cs" />
|
||||
<Compile Include="BackOffice\ContentTypeModelValidatorBase.cs" />
|
||||
<Compile Include="BackOffice\MediaTypeModelValidator.cs" />
|
||||
<Compile Include="BackOffice\MemberTypeModelValidator.cs" />
|
||||
<Compile Include="Building\Builder.cs" />
|
||||
<Compile Include="Building\PropertyModel.cs" />
|
||||
<Compile Include="Building\TextBuilder.cs" />
|
||||
<Compile Include="Building\TextHeaderWriter.cs" />
|
||||
<Compile Include="Building\TypeModel.cs" />
|
||||
<Compile Include="Compose\DisabledModelsBuilderComponent.cs" />
|
||||
<Compile Include="Compose\DisableModelsBuilderManifestFilter.cs" />
|
||||
<Compile Include="ConfigsExtensions.cs" />
|
||||
<Compile Include="Configuration\IModelsBuilderConfig.cs" />
|
||||
<Compile Include="Configuration\ModelsBuilderConfig.cs" />
|
||||
@@ -71,7 +76,7 @@
|
||||
<Compile Include="LiveModelsProvider.cs" />
|
||||
<Compile Include="LiveModelsProviderModule.cs" />
|
||||
<Compile Include="Building\ModelsGenerator.cs" />
|
||||
<Compile Include="BackOffice\ModelsBuilderBackOfficeController.cs" />
|
||||
<Compile Include="BackOffice\ModelsBuilderDashboardController.cs" />
|
||||
<Compile Include="Compose\ModelsBuilderComponent.cs" />
|
||||
<Compile Include="Compose\ModelsBuilderComposer.cs" />
|
||||
<Compile Include="Building\TypeModelHasher.cs" />
|
||||
@@ -7,9 +7,9 @@ using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.Core.Services;
|
||||
using Umbraco.Core.Strings;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
|
||||
namespace Umbraco.ModelsBuilder
|
||||
namespace Umbraco.ModelsBuilder.Embedded
|
||||
{
|
||||
public sealed class UmbracoServices
|
||||
{
|
||||
@@ -32,6 +32,10 @@ namespace Umbraco.ModelsBuilder
|
||||
{
|
||||
var types = new List<TypeModel>();
|
||||
|
||||
// TODO: this will require 3 rather large SQL queries on startup in PureLive. I know that these will be cached after lookup but it will slow
|
||||
// down startup time ... BUT these queries are also used in NuCache on startup so we can't really avoid them. Maybe one day we can
|
||||
// load all of these in in one query and still have them cached per service, and/or somehow improve the perf of these since they are used on startup
|
||||
// in more than one place.
|
||||
types.AddRange(GetTypes(PublishedItemType.Content, _contentTypeService.GetAll().Cast<IContentTypeComposition>().ToArray()));
|
||||
types.AddRange(GetTypes(PublishedItemType.Media, _mediaTypeService.GetAll().Cast<IContentTypeComposition>().ToArray()));
|
||||
types.AddRange(GetTypes(PublishedItemType.Member, _memberTypeService.GetAll().Cast<IContentTypeComposition>().ToArray()));
|
||||
@@ -2,15 +2,14 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.CodeAnalysis;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.Core.Composing;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Tests
|
||||
namespace Umbraco.Tests.ModelsBuilder
|
||||
{
|
||||
[TestFixture]
|
||||
public class BuilderTests
|
||||
@@ -68,7 +67,7 @@ using System.Web;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.ModelsBuilder;
|
||||
using Umbraco.ModelsBuilder.Embedded;
|
||||
|
||||
namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
@@ -183,7 +182,7 @@ using System.Web;
|
||||
using Umbraco.Core.Models;
|
||||
using Umbraco.Core.Models.PublishedContent;
|
||||
using Umbraco.Web;
|
||||
using Umbraco.ModelsBuilder;
|
||||
using Umbraco.ModelsBuilder.Embedded;
|
||||
|
||||
namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
@@ -224,7 +223,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
[Test]
|
||||
public void GenerateAmbiguous()
|
||||
{
|
||||
// NOTE: since
|
||||
// NOTE: since
|
||||
|
||||
var type1 = new TypeModel
|
||||
{
|
||||
@@ -246,7 +245,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
Alias = "prop2",
|
||||
ClrName = "Prop2",
|
||||
ModelClrType = typeof(System.Text.StringBuilder),
|
||||
ModelClrType = typeof(global::System.Text.StringBuilder),
|
||||
});
|
||||
type1.Properties.Add(new PropertyModel
|
||||
{
|
||||
@@ -278,8 +277,8 @@ namespace Umbraco.Web.PublishedModels
|
||||
|
||||
[TestCase("int", typeof(int))]
|
||||
[TestCase("global::System.Collections.Generic.IEnumerable<int>", typeof(IEnumerable<int>))]
|
||||
[TestCase("global::Umbraco.ModelsBuilder.Tests.BuilderTestsClass1", typeof(BuilderTestsClass1))]
|
||||
[TestCase("global::Umbraco.ModelsBuilder.Tests.BuilderTests.Class1", typeof(Class1))]
|
||||
[TestCase("global::Umbraco.Tests.ModelsBuilder.BuilderTestsClass1", typeof(BuilderTestsClass1))]
|
||||
[TestCase("global::Umbraco.Tests.ModelsBuilder.BuilderTests.Class1", typeof(Class1))]
|
||||
public void WriteClrType(string expected, Type input)
|
||||
{
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
@@ -294,15 +293,15 @@ namespace Umbraco.Web.PublishedModels
|
||||
|
||||
[TestCase("int", typeof(int))]
|
||||
[TestCase("global::System.Collections.Generic.IEnumerable<int>", typeof(IEnumerable<int>))]
|
||||
[TestCase("global::Umbraco.ModelsBuilder.Tests.BuilderTestsClass1", typeof(BuilderTestsClass1))]
|
||||
[TestCase("global::Umbraco.ModelsBuilder.Tests.BuilderTests.Class1", typeof(Class1))]
|
||||
[TestCase("global::Umbraco.Tests.ModelsBuilder.BuilderTestsClass1", typeof(BuilderTestsClass1))]
|
||||
[TestCase("global::Umbraco.Tests.ModelsBuilder.BuilderTests.Class1", typeof(Class1))]
|
||||
public void WriteClrTypeUsing(string expected, Type input)
|
||||
{
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
// which means global:: syntax will be applied to most things
|
||||
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("Umbraco.ModelsBuilder.Tests");
|
||||
builder.Using.Add("Umbraco.Tests.ModelsBuilder");
|
||||
builder.ModelsNamespaceForTests = "ModelsNamespace";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, input);
|
||||
@@ -314,7 +313,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("System.Text");
|
||||
builder.ModelsNamespaceForTests = "Umbraco.ModelsBuilder.Tests.Models";
|
||||
builder.ModelsNamespaceForTests = "Umbraco.Tests.ModelsBuilder.Models";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(StringBuilder));
|
||||
|
||||
@@ -328,7 +327,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
public void WriteClrTypeAnother_WithoutUsing()
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.ModelsNamespaceForTests = "Umbraco.ModelsBuilder.Tests.Models";
|
||||
builder.ModelsNamespaceForTests = "Umbraco.Tests.ModelsBuilder.Models";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(StringBuilder));
|
||||
Assert.AreEqual("global::System.Text.StringBuilder", sb.ToString());
|
||||
@@ -339,10 +338,10 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("System.Text");
|
||||
builder.Using.Add("Umbraco.ModelsBuilder.Tests");
|
||||
builder.Using.Add("Umbraco.Tests.ModelsBuilder");
|
||||
builder.ModelsNamespaceForTests = "SomeRandomNamespace";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(System.Text.ASCIIEncoding));
|
||||
builder.WriteClrType(sb, typeof(global::System.Text.ASCIIEncoding));
|
||||
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
// which means global:: syntax will be applied to most things
|
||||
@@ -355,10 +354,10 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("System.Text");
|
||||
builder.Using.Add("Umbraco.ModelsBuilder.Tests");
|
||||
builder.Using.Add("Umbraco.Tests.ModelsBuilder");
|
||||
builder.ModelsNamespaceForTests = "SomeBorkedNamespace";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(System.Text.ASCIIEncoding));
|
||||
builder.WriteClrType(sb, typeof(global::System.Text.ASCIIEncoding));
|
||||
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
// which means global:: syntax will be applied to most things
|
||||
@@ -371,7 +370,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("System.Text");
|
||||
builder.Using.Add("Umbraco.ModelsBuilder.Tests");
|
||||
builder.Using.Add("Umbraco.Tests.ModelsBuilder");
|
||||
builder.ModelsNamespaceForTests = "SomeRandomNamespace";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(ASCIIEncoding));
|
||||
@@ -379,7 +378,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
// which means global:: syntax will be applied to most things
|
||||
|
||||
Assert.AreEqual("global::Umbraco.ModelsBuilder.Tests.ASCIIEncoding", sb.ToString());
|
||||
Assert.AreEqual("global::Umbraco.Tests.ModelsBuilder.ASCIIEncoding", sb.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -387,15 +386,15 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("System.Text");
|
||||
builder.Using.Add("Umbraco.ModelsBuilder.Tests");
|
||||
builder.ModelsNamespaceForTests = "Umbraco.ModelsBuilder.Tests.Models";
|
||||
builder.Using.Add("Umbraco.Tests.ModelsBuilder");
|
||||
builder.ModelsNamespaceForTests = "Umbraco.Tests.ModelsBuilder.Models";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(ASCIIEncoding));
|
||||
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
// which means global:: syntax will be applied to most things
|
||||
|
||||
Assert.AreEqual("global::Umbraco.ModelsBuilder.Tests.ASCIIEncoding", sb.ToString());
|
||||
Assert.AreEqual("global::Umbraco.Tests.ModelsBuilder.ASCIIEncoding", sb.ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -403,7 +402,7 @@ namespace Umbraco.Web.PublishedModels
|
||||
{
|
||||
var builder = new TextBuilder();
|
||||
builder.Using.Add("System.Text");
|
||||
builder.Using.Add("Umbraco.ModelsBuilder.Tests");
|
||||
builder.Using.Add("Umbraco.Tests.ModelsBuilder");
|
||||
builder.ModelsNamespaceForTests = "SomeRandomNamespace";
|
||||
var sb = new StringBuilder();
|
||||
builder.WriteClrType(sb, typeof(ASCIIEncoding.Nested));
|
||||
@@ -411,13 +410,13 @@ namespace Umbraco.Web.PublishedModels
|
||||
// note - these assertions differ from the original tests in MB because in the embedded version, the result of Builder.IsAmbiguousSymbol is always true
|
||||
// which means global:: syntax will be applied to most things
|
||||
|
||||
Assert.AreEqual("global::Umbraco.ModelsBuilder.Tests.ASCIIEncoding.Nested", sb.ToString());
|
||||
Assert.AreEqual("global::Umbraco.Tests.ModelsBuilder.ASCIIEncoding.Nested", sb.ToString());
|
||||
}
|
||||
|
||||
public class Class1 { }
|
||||
}
|
||||
|
||||
// make it public to be ambiguous (see above)
|
||||
// make it public to be ambiguous (see above)
|
||||
public class ASCIIEncoding
|
||||
{
|
||||
// can we handle nested types?
|
||||
@@ -425,9 +424,6 @@ namespace Umbraco.Web.PublishedModels
|
||||
}
|
||||
|
||||
class BuilderTestsClass1 {}
|
||||
}
|
||||
|
||||
namespace SomeBorkedNamespace
|
||||
{
|
||||
public class System { }
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using System.Configuration;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.ModelsBuilder.Configuration;
|
||||
using Umbraco.ModelsBuilder.Embedded.Configuration;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Tests
|
||||
namespace Umbraco.Tests.ModelsBuilder
|
||||
{
|
||||
[TestFixture]
|
||||
public class ModelsBuilderConfigTests
|
||||
|
||||
@@ -1,10 +1,4 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Tests
|
||||
namespace Umbraco.Tests.ModelsBuilder
|
||||
{
|
||||
public static class StringExtensions
|
||||
{
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using NUnit.Framework;
|
||||
using Umbraco.ModelsBuilder.Building;
|
||||
using Umbraco.ModelsBuilder.Embedded;
|
||||
using Umbraco.ModelsBuilder.Embedded.Building;
|
||||
|
||||
namespace Umbraco.ModelsBuilder.Tests
|
||||
namespace Umbraco.Tests.ModelsBuilder
|
||||
{
|
||||
[TestFixture]
|
||||
public class UmbracoApplicationTests
|
||||
|
||||
@@ -553,9 +553,9 @@
|
||||
<Project>{31785BC3-256C-4613-B2F5-A1B0BDDED8C1}</Project>
|
||||
<Name>Umbraco.Core</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Umbraco.ModelsBuilder\Umbraco.ModelsBuilder.csproj">
|
||||
<ProjectReference Include="..\Umbraco.ModelsBuilder.Embedded\Umbraco.ModelsBuilder.Embedded.csproj">
|
||||
<Project>{52ac0ba8-a60e-4e36-897b-e8b97a54ed1c}</Project>
|
||||
<Name>Umbraco.ModelsBuilder</Name>
|
||||
<Name>Umbraco.ModelsBuilder.Embedded</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Umbraco.Web\Umbraco.Web.csproj">
|
||||
<Project>{651E1350-91B6-44B7-BD60-7207006D7003}</Project>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
|
||||
<RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
|
||||
<UseIISExpress>true</UseIISExpress>
|
||||
<IISExpressSSLPort>44319</IISExpressSSLPort>
|
||||
<IISExpressSSLPort>44331</IISExpressSSLPort>
|
||||
<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication>
|
||||
<IISExpressWindowsAuthentication>disabled</IISExpressWindowsAuthentication>
|
||||
<IISExpressUseClassicPipelineMode>false</IISExpressUseClassicPipelineMode>
|
||||
@@ -118,9 +118,9 @@
|
||||
<Name>Umbraco.Examine</Name>
|
||||
<Project>{07FBC26B-2927-4A22-8D96-D644C667FECC}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Umbraco.ModelsBuilder\Umbraco.ModelsBuilder.csproj">
|
||||
<ProjectReference Include="..\Umbraco.ModelsBuilder.Embedded\Umbraco.ModelsBuilder.Embedded.csproj">
|
||||
<Project>{52ac0ba8-a60e-4e36-897b-e8b97a54ed1c}</Project>
|
||||
<Name>Umbraco.ModelsBuilder</Name>
|
||||
<Name>Umbraco.ModelsBuilder.Embedded</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Umbraco.Web\Umbraco.Web.csproj">
|
||||
<Project>{651e1350-91b6-44b7-bd60-7207006d7003}</Project>
|
||||
@@ -144,9 +144,9 @@
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
</Compile>
|
||||
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.controller.js" />
|
||||
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.html" />
|
||||
<Content Include="App_Plugins\ModelsBuilder\modelsbuilder.resource.js" />
|
||||
<Content Include="App_Plugins\UmbModelsBuilder\modelsbuilder.controller.js" />
|
||||
<Content Include="App_Plugins\UmbModelsBuilder\modelsbuilder.html" />
|
||||
<Content Include="App_Plugins\UmbModelsBuilder\modelsbuilder.resource.js" />
|
||||
<Content Include="Config\grid.editors.config.js" />
|
||||
<Content Include="Config\Lang\cs-CZ.user.xml" />
|
||||
<Content Include="Config\Lang\da-DK.user.xml" />
|
||||
@@ -172,7 +172,7 @@
|
||||
<Content Include="Umbraco\Config\Lang\zh_tw.xml" />
|
||||
<Content Include="Config\Splashes\noNodes.aspx" />
|
||||
<Content Include="Umbraco\Install\Views\Web.config" />
|
||||
<Content Include="App_Plugins\ModelsBuilder\package.manifest" />
|
||||
<Content Include="App_Plugins\UmbModelsBuilder\package.manifest" />
|
||||
<None Include="Config\ClientDependency.Release.config">
|
||||
<DependentUpon>ClientDependency.config</DependentUpon>
|
||||
<SubType>Designer</SubType>
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
|
||||
<add key="owin:appStartup" value="UmbracoDefaultOwinStartup" />
|
||||
|
||||
<add key="Umbraco.ModelsBuilder.Enable" value="true" />
|
||||
<add key="Umbraco.ModelsBuilder.ModelsMode" value="PureLive" />
|
||||
</appSettings>
|
||||
|
||||
|
||||
@@ -14,9 +14,7 @@ namespace Umbraco.Web.Editors
|
||||
// initialized with all IEditorValidator instances
|
||||
//
|
||||
// validation is used exclusively in ContentTypeControllerBase
|
||||
// the whole thing is internal at the moment, never released
|
||||
// and, there are no IEditorValidator implementation in Core
|
||||
// so... this all mechanism is basically useless
|
||||
// currently the only implementations are for Models Builder.
|
||||
|
||||
/// <summary>
|
||||
/// Provides a general object validator.
|
||||
|
||||
@@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
|
||||
|
||||
// Umbraco Cms
|
||||
[assembly: InternalsVisibleTo("Umbraco.Web.UI")]
|
||||
|
||||
[assembly: InternalsVisibleTo("Umbraco.ModelsBuilder.Embedded")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests")]
|
||||
[assembly: InternalsVisibleTo("Umbraco.Tests.Benchmarks")]
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.29009.5
|
||||
VisualStudioVersion = 16.0.29209.152
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.Web.UI", "Umbraco.Web.UI\Umbraco.Web.UI.csproj", "{4C4C194C-B5E4-4991-8F87-4373E24CC19F}"
|
||||
@@ -103,7 +102,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IssueTemplates", "IssueTemp
|
||||
..\.github\ISSUE_TEMPLATE\5_Security_issue.md = ..\.github\ISSUE_TEMPLATE\5_Security_issue.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.ModelsBuilder", "Umbraco.ModelsBuilder\Umbraco.ModelsBuilder.csproj", "{52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Umbraco.ModelsBuilder.Embedded", "Umbraco.ModelsBuilder.Embedded\Umbraco.ModelsBuilder.Embedded.csproj", "{52AC0BA8-A60E-4E36-897B-E8B97A54ED1C}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
||||
Reference in New Issue
Block a user