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:
Bjarke Berg
2019-10-29 15:12:19 +01:00
committed by GitHub
58 changed files with 308 additions and 164 deletions

View File

@@ -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>

View File

@@ -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" />

View File

@@ -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>

View File

@@ -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")]

View File

@@ -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")]

View File

@@ -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.

View File

@@ -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)
{
}
}
}

View File

@@ -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;

View File

@@ -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 />&nbsp;<br />ModelsBuilder is disabled<br />(the .Enable key is missing, or its value is not 'true').";
var sb = new StringBuilder();
sb.Append("Version: ");

View File

@@ -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)
{
}
}
}

View File

@@ -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)
{
}
}
}

View File

@@ -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(),

View File

@@ -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));

View File

@@ -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
{

View File

@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
namespace Umbraco.ModelsBuilder.Building
namespace Umbraco.ModelsBuilder.Embedded.Building
{
/// <summary>
/// Represents a model property.

View File

@@ -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)

View File

@@ -1,6 +1,6 @@
using System.Text;
namespace Umbraco.ModelsBuilder.Building
namespace Umbraco.ModelsBuilder.Embedded.Building
{
internal static class TextHeaderWriter
{

View File

@@ -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.

View File

@@ -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();
}
}

View File

@@ -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));
}
}
}

View File

@@ -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()
{
}
}
}

View File

@@ -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;

View File

@@ -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 =>

View File

@@ -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
{

View File

@@ -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.

View File

@@ -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; }

View File

@@ -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>

View File

@@ -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.

View File

@@ -1,4 +1,4 @@
namespace Umbraco.ModelsBuilder.Configuration
namespace Umbraco.ModelsBuilder.Embedded.Configuration
{
/// <summary>
/// Provides extensions for the <see cref="ModelsMode"/> enumeration.

View File

@@ -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

View File

@@ -1,6 +1,6 @@
using System;
namespace Umbraco.ModelsBuilder
namespace Umbraco.ModelsBuilder.Embedded
{
/// <summary>
/// Indicates that a property implements a given property alias.

View File

@@ -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

View File

@@ -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);

View File

@@ -1,6 +1,6 @@
using System;
namespace Umbraco.ModelsBuilder
namespace Umbraco.ModelsBuilder.Embedded
{
/// <summary>
/// Indicates that an Assembly is a Models Builder assembly.

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -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")]

View File

@@ -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

View File

@@ -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

View File

@@ -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
{

View File

@@ -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
{

View File

@@ -1,6 +1,6 @@
using System;
namespace Umbraco.ModelsBuilder
namespace Umbraco.ModelsBuilder.Embedded
{
internal static class TypeExtensions
{

View File

@@ -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" />

View File

@@ -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()));

View File

@@ -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 { }
}

View File

@@ -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

View File

@@ -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
{

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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.

View File

@@ -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")]

View File

@@ -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