mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Recipe discovery for extensions
Setup calls RecipeManager::DiscoverRecipes Setup/Recipe contains default recipe files Unit tests for recipe discovery using embedded resources --HG-- branch : recipe
This commit is contained in:
@@ -143,6 +143,7 @@
|
||||
<Compile Include="Indexing\LuceneIndexProviderTests.cs" />
|
||||
<Compile Include="Indexing\LuceneSearchBuilderTests.cs" />
|
||||
<Compile Include="Media\Services\MediaServiceTests.cs" />
|
||||
<Compile Include="Recipes\Services\RecipeManagerTests.cs" />
|
||||
<Compile Include="Scripting.Dlr\EvaluatorTests.cs" />
|
||||
<Compile Include="Scripting\EvaluatorTestsBase.cs" />
|
||||
<Compile Include="Scripting\EvaluatorTests.cs" />
|
||||
@@ -215,6 +216,10 @@
|
||||
<Project>{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059}</Project>
|
||||
<Name>Orchard.Packaging</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Orchard.Web\Modules\Orchard.Recipes\Orchard.Recipes.csproj">
|
||||
<Project>{FC1D74E8-7A4D-48F4-83DE-95C6173780C4}</Project>
|
||||
<Name>Orchard.Recipes</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\Orchard.Web\Modules\Orchard.Roles\Orchard.Roles.csproj">
|
||||
<Project>{D10AD48F-407D-4DB5-A328-173EC7CB010F}</Project>
|
||||
<Name>Orchard.Roles</Name>
|
||||
@@ -272,7 +277,13 @@
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Packaging\Services\Hello.World.csproj.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Recipes\Services\FoldersData\Sample1\Module.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup />
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Recipes\Services\FoldersData\Sample1\Recipes\cms.recipe.xml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
|
@@ -0,0 +1,8 @@
|
||||
Name: Le plug-in français
|
||||
Author: Bertrand Le Roy
|
||||
Description:
|
||||
This plug-in replaces
|
||||
'the' with 'le'
|
||||
Version: 1.0.20
|
||||
Tags: plug-in, français, the, le
|
||||
homepage: http://weblogs.asp.net/bleroy
|
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
@@ -0,0 +1,90 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Caching;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Folders;
|
||||
using Orchard.Environment.Extensions.Loaders;
|
||||
using Orchard.FileSystems.WebSite;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
using Orchard.Tests.Stubs;
|
||||
|
||||
namespace Orchard.Tests.Modules.Recipes.Services {
|
||||
[TestFixture]
|
||||
public class RecipeManagerTests {
|
||||
private IContainer _container;
|
||||
private IRecipeManager _recipeManager;
|
||||
private IExtensionFolders _folders;
|
||||
|
||||
private const string DataPrefix = "Orchard.Tests.Modules.Recipes.Services.FoldersData.";
|
||||
private string _tempFolderName;
|
||||
|
||||
[SetUp]
|
||||
public void Init() {
|
||||
_tempFolderName = Path.GetTempFileName();
|
||||
File.Delete(_tempFolderName);
|
||||
var assembly = GetType().Assembly;
|
||||
foreach (var name in assembly.GetManifestResourceNames()) {
|
||||
if (name.StartsWith(DataPrefix)) {
|
||||
string text;
|
||||
using (var stream = assembly.GetManifestResourceStream(name)) {
|
||||
using (var reader = new StreamReader(stream))
|
||||
text = reader.ReadToEnd();
|
||||
|
||||
}
|
||||
|
||||
// Pro filtering
|
||||
var relativePath = name
|
||||
.Substring(DataPrefix.Length)
|
||||
.Replace(".txt", ":txt")
|
||||
.Replace(".recipe.xml", ":recipe:xml")
|
||||
.Replace('.', Path.DirectorySeparatorChar)
|
||||
.Replace(":txt", ".txt")
|
||||
.Replace(":recipe:xml", ".recipe.xml");
|
||||
|
||||
var targetPath = Path.Combine(_tempFolderName, relativePath);
|
||||
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
|
||||
using (var stream = new FileStream(targetPath, FileMode.Create)) {
|
||||
using (var writer = new StreamWriter(stream)) {
|
||||
writer.Write(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var builder = new ContainerBuilder();
|
||||
_folders = new ModuleFolders(new[] { _tempFolderName }, new StubCacheManager(), new StubWebSiteFolder());
|
||||
builder.RegisterType<RecipeManager>().As<IRecipeManager>();
|
||||
builder.RegisterType<ExtensionManager>().As<IExtensionManager>();
|
||||
builder.RegisterType<StubCacheManager>().As<ICacheManager>();
|
||||
builder.RegisterInstance(_folders).As<IExtensionFolders>();
|
||||
builder.RegisterType<Environment.Extensions.ExtensionManagerTests.StubLoaders>().As<IExtensionLoader>();
|
||||
builder.RegisterType<RecipeParser>().As<IRecipeParser>();
|
||||
builder.RegisterType<StubWebSiteFolder>().As<IWebSiteFolder>();
|
||||
|
||||
_container = builder.Build();
|
||||
_recipeManager = _container.Resolve<IRecipeManager>();
|
||||
}
|
||||
|
||||
[TearDown]
|
||||
public void Term() {
|
||||
Directory.Delete(_tempFolderName, true);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DiscoverRecipesFailsToFindRecipesWhenCalledWithNotExistingExtension() {
|
||||
var recipes = (List<Recipe>) _recipeManager.DiscoverRecipes("cantfindme");
|
||||
|
||||
Assert.That(recipes.Count, Is.EqualTo(0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DiscoverRecipesShouldDiscoverRecipeXmlFiles() {
|
||||
var recipes = (List<Recipe>)_recipeManager.DiscoverRecipes("Sample1");
|
||||
Assert.That(recipes.Count, Is.EqualTo(1));
|
||||
}
|
||||
}
|
||||
}
|
@@ -15,7 +15,10 @@ namespace Orchard.Tests.Stubs {
|
||||
}
|
||||
|
||||
public IEnumerable<string> ListFiles(string path, bool recursive) {
|
||||
throw new NotImplementedException();
|
||||
if (!Directory.Exists(path))
|
||||
return Enumerable.Empty<string>();
|
||||
|
||||
return Directory.GetFiles(path);
|
||||
}
|
||||
|
||||
public bool FileExists(string virtualPath) {
|
||||
|
@@ -1,28 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.FileSystems.WebSite;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Recipes.Models;
|
||||
|
||||
namespace Orchard.Recipes.Services {
|
||||
public class RecipeManager : IRecipeManager {
|
||||
private readonly IExtensionManager _extensionManager;
|
||||
private readonly IWebSiteFolder _webSiteFolder;
|
||||
private readonly IRecipeParser _recipeParser;
|
||||
private readonly IEnumerable<IRecipeHandler> _recipeHandlers;
|
||||
|
||||
public RecipeManager(IRecipeParser recipeParser, IEnumerable<IRecipeHandler> recipeHandlers) {
|
||||
public RecipeManager(
|
||||
IExtensionManager extensionManager,
|
||||
IWebSiteFolder webSiteFolder,
|
||||
IRecipeParser recipeParser,
|
||||
IEnumerable<IRecipeHandler> recipeHandlers) {
|
||||
_extensionManager = extensionManager;
|
||||
_webSiteFolder = webSiteFolder;
|
||||
_recipeParser = recipeParser;
|
||||
_recipeHandlers = recipeHandlers;
|
||||
|
||||
Logger = NullLogger.Instance;
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
|
||||
public Localizer T { get; set; }
|
||||
ILogger Logger { get; set; }
|
||||
|
||||
public void Execute(Recipe recipe) {
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public IEnumerable<Recipe> DiscoverRecipes(string extensionName) {
|
||||
throw new NotImplementedException();
|
||||
var recipes = new List<Recipe>();
|
||||
var extension = _extensionManager.GetExtension(extensionName);
|
||||
if (extension != null) {
|
||||
var recipeLocation = Path.Combine(extension.Location, extensionName, "Recipes");
|
||||
var recipeFiles = _webSiteFolder.ListFiles(recipeLocation, true);
|
||||
recipes.AddRange(
|
||||
from recipeFile in recipeFiles
|
||||
where recipeFile.EndsWith(".recipe.xml")
|
||||
select _recipeParser.ParseRecipe(_webSiteFolder.ReadFile(recipeFile)));
|
||||
}
|
||||
else {
|
||||
Logger.Error("Could not discover recipes because module '{0}' was not found.", extensionName);
|
||||
}
|
||||
|
||||
return recipes;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
using System;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Recipes.Models;
|
||||
|
||||
namespace Orchard.Recipes.Services {
|
||||
@@ -11,7 +10,7 @@ namespace Orchard.Recipes.Services {
|
||||
public Localizer T { get; set; }
|
||||
|
||||
public Recipe ParseRecipe(string recipeText) {
|
||||
throw new NotImplementedException();
|
||||
return new Recipe();
|
||||
}
|
||||
}
|
||||
}
|
@@ -76,6 +76,9 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Content\synchronizing.gif" />
|
||||
<Content Include="Recipes\blog.recipe.xml" />
|
||||
<Content Include="Recipes\cms.recipe.xml" />
|
||||
<Content Include="Recipes\minimal.recipe.xml" />
|
||||
<Content Include="Scripts\setup.js" />
|
||||
<Content Include="Views\Setup\Index.cshtml" />
|
||||
</ItemGroup>
|
||||
|
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Web;
|
||||
@@ -23,6 +24,8 @@ using Orchard.Environment.Descriptor.Models;
|
||||
using Orchard.Indexing;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Localization.Services;
|
||||
using Orchard.Recipes.Models;
|
||||
using Orchard.Recipes.Services;
|
||||
using Orchard.Reports.Services;
|
||||
using Orchard.Security;
|
||||
using Orchard.Settings;
|
||||
@@ -204,6 +207,9 @@ namespace Orchard.Setup.Services {
|
||||
}
|
||||
|
||||
private void CreateTenantData(SetupContext context, IWorkContextScope environment) {
|
||||
var recipeManager = environment.Resolve<IRecipeManager>();
|
||||
var setupRecipes = recipeManager.DiscoverRecipes("Orchard.Setup");
|
||||
|
||||
// create superuser
|
||||
var membershipService = environment.Resolve<IMembershipService>();
|
||||
var user =
|
||||
|
Reference in New Issue
Block a user