shaml 0.5.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/shaml +4 -0
- data/lib/shaml/command.rb +175 -0
- data/lib/shaml/mono_load.rb +92 -0
- data/lib/shaml/shaml.rb +10 -0
- data/lib/shaml/templates/Create.haml +3 -0
- data/lib/shaml/templates/Delete.haml +7 -0
- data/lib/shaml/templates/Edit.haml +3 -0
- data/lib/shaml/templates/Index.haml +24 -0
- data/lib/shaml/templates/Show.haml +10 -0
- data/lib/shaml/templates/WebSample.cs +14 -0
- data/lib/shaml/templates/WebSampleTests.cs +21 -0
- data/lib/shaml/templates/WebSamplesController.cs +140 -0
- data/lib/shaml/templates/WebSamplesControllerTests.cs +147 -0
- data/lib/shaml/templates/_WebSampleForm.haml +16 -0
- data/lib/shaml/templates/shaml_base_template.dat +0 -0
- metadata +104 -0
data/bin/shaml
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
require 'zip/zip'
|
2
|
+
|
3
|
+
module Shaml
|
4
|
+
class CommandLoader
|
5
|
+
def initialize
|
6
|
+
end
|
7
|
+
|
8
|
+
def getappname
|
9
|
+
appname = Dir.glob("*.sln").first
|
10
|
+
if appname.nil?
|
11
|
+
puts 'S#aml ERROR: solution file not found. Change directory to a s#aml-architecture project'
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
appname.gsub(".sln","")
|
15
|
+
end
|
16
|
+
|
17
|
+
def camelcase(phrase)
|
18
|
+
phrase.gsub(/^[a-z]|[ _]+[a-z]/) { |a| a.upcase }.gsub(/[ _]/, '')
|
19
|
+
end
|
20
|
+
|
21
|
+
def unzip_file(file, destination)
|
22
|
+
Zip::ZipFile.open(file) { |zip_file|
|
23
|
+
zip_file.each { |f|
|
24
|
+
f_path=File.join(destination, f.name)
|
25
|
+
FileUtils.mkdir_p(File.dirname(f_path))
|
26
|
+
zip_file.extract(f, f_path) unless File.exist?(f_path)
|
27
|
+
}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def convert_file(file, appname, modelname, propertydescriptor)
|
32
|
+
out = ""
|
33
|
+
pstring = ""
|
34
|
+
insideprop = false
|
35
|
+
file.each_line do |line|
|
36
|
+
out << line.gsub("WebBase",appname).gsub("WebSample", camelcase(modelname)).gsub("websample", modelname);
|
37
|
+
end
|
38
|
+
out
|
39
|
+
end
|
40
|
+
|
41
|
+
def copy_file(from,to,appname,modelname,propertydescriptor)
|
42
|
+
outfname = to.gsub("WebSample",camelcase(modelname))
|
43
|
+
FileUtils.mkdir_p(File.dirname(outfname))
|
44
|
+
File.open(from,"rb") do |infile|
|
45
|
+
File.open(outfname,"wb+") do |outfile|
|
46
|
+
puts "Writing #{outfname}"
|
47
|
+
outfile.write convert_file(infile.read,appname,modelname,propertydescriptor)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def run
|
53
|
+
if ARGV.length == 0 then
|
54
|
+
puts "S#aml architecture: ASP.NET MVC 2 and NHibernate 2.1 on mono 2.4.4+"
|
55
|
+
puts " version: #{SHAML_VERSION}"
|
56
|
+
puts
|
57
|
+
puts "Usage:"
|
58
|
+
puts " shaml command [parameters]"
|
59
|
+
puts
|
60
|
+
puts "Where command might be:"
|
61
|
+
puts " generate"
|
62
|
+
puts " app AppName : Create new shaml application"
|
63
|
+
puts " resource ResName : Create new CRUD resource with"
|
64
|
+
puts " a model, a view and a controller"
|
65
|
+
puts " controller Controller : Create a standalone controller"
|
66
|
+
puts " model Model : Create a standalone model"
|
67
|
+
puts
|
68
|
+
puts " compile : Compiles the solution using xbuild"
|
69
|
+
puts " server : Runs xsp2"
|
70
|
+
puts
|
71
|
+
puts " console : Starts a csharp console"
|
72
|
+
puts " gconsole : Starts a gsharp console"
|
73
|
+
puts " runner script_name.cs : Runs the script"
|
74
|
+
puts
|
75
|
+
puts "Examples: "
|
76
|
+
puts " shaml generate app Blog"
|
77
|
+
puts " shaml generate resource Post"
|
78
|
+
puts " shaml compile"
|
79
|
+
puts
|
80
|
+
puts "The console, gconsole and runner parameters will preload the solutions"
|
81
|
+
puts "assemblies and configuration files, and loads everything you need to get"
|
82
|
+
puts "working with the domain objects"
|
83
|
+
else
|
84
|
+
command = ARGV.shift
|
85
|
+
case command
|
86
|
+
when "generate" then
|
87
|
+
type = ARGV.shift
|
88
|
+
name = ARGV.shift
|
89
|
+
if name then
|
90
|
+
case type
|
91
|
+
when "app" then
|
92
|
+
unzip_file(File.join(TEMPLATEDIR,"shaml_base_template.dat"), ".shaml_extract_temp")
|
93
|
+
Dir.glob(".shaml_extract_temp/**/*").each do |filename|
|
94
|
+
infname = filename
|
95
|
+
outfname = filename.gsub("WebBase",name).gsub(".shaml_extract_temp",name);
|
96
|
+
FileUtils.mkdir_p(File.dirname(outfname))
|
97
|
+
unless File.directory?(infname)
|
98
|
+
File.open(infname,"rb") do |infile|
|
99
|
+
File.open(outfname,"wb+") do |outfile|
|
100
|
+
puts "Writing #{outfname}"
|
101
|
+
if infname=~/\.dll/ then
|
102
|
+
outfile.write infile.read
|
103
|
+
else
|
104
|
+
outfile.write infile.read.gsub("WebBase",name);
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
FileUtils.rm_rf ".shaml_extract_temp"
|
111
|
+
when "resource"
|
112
|
+
desc = ARGV.shift || nil
|
113
|
+
appname = getappname
|
114
|
+
copy_file(File.join(TEMPLATEDIR,"WebSample.cs"),File.join(appname,"App","Models","WebSample.cs"),appname,name,desc)
|
115
|
+
copy_file(File.join(TEMPLATEDIR,"WebSamplesController.cs"),File.join(appname,"App","Controllers","WebSamplesController.cs"),appname,name,desc)
|
116
|
+
copy_file(File.join(TEMPLATEDIR,"_WebSampleForm.haml"),File.join(appname,"App","Views","WebSamples","_WebSampleForm.haml"),appname,name,desc)
|
117
|
+
copy_file(File.join(TEMPLATEDIR,"Create.haml"),File.join(appname,"App","Views","WebSamples","Create.haml"),appname,name,desc)
|
118
|
+
copy_file(File.join(TEMPLATEDIR,"Delete.haml"),File.join(appname,"App","Views","WebSamples","Delete.haml"),appname,name,desc)
|
119
|
+
copy_file(File.join(TEMPLATEDIR,"Edit.haml"),File.join(appname,"App","Views","WebSamples","Edit.haml"),appname,name,desc)
|
120
|
+
copy_file(File.join(TEMPLATEDIR,"Index.haml"),File.join(appname,"App","Views","WebSamples","Index.haml"),appname,name,desc)
|
121
|
+
copy_file(File.join(TEMPLATEDIR,"Show.haml"),File.join(appname,"App","Views","WebSamples","Show.haml"),appname,name,desc)
|
122
|
+
copy_file(File.join(TEMPLATEDIR,"WebSampleTests.cs"),File.join(appname+".Tests","Tests","Core","WebSampleTests.cs"),appname,name,desc)
|
123
|
+
copy_file(File.join(TEMPLATEDIR,"WebSamplesControllerTests.cs"),File.join(appname+".Tests","Tests","Web","Controllers","WebSamplesControllerTests.cs"),appname,name,desc)
|
124
|
+
when "model"
|
125
|
+
desc = ARGV.shift || nil
|
126
|
+
appname = getappname
|
127
|
+
copy_file(File.join(TEMPLATEDIR,"WebSample.cs"),File.join(appname,"App","Models","WebSample.cs"),appname,name,desc)
|
128
|
+
copy_file(File.join(TEMPLATEDIR,"WebSampleTests.cs"),File.join(appname+".Tests","Tests","Core","WebSampleTests.cs"),appname,name,desc)
|
129
|
+
when "controller"
|
130
|
+
desc = ARGV.shift || nil
|
131
|
+
appname = getappname
|
132
|
+
copy_file(File.join(TEMPLATEDIR,"WebSamplesController.cs"),File.join(appname,"App","Controllers","WebSamplesController.cs"),appname,name,desc)
|
133
|
+
copy_file(File.join(TEMPLATEDIR,"_WebSampleForm.haml"),File.join(appname,"App","Views","WebSamples","_WebSampleForm.haml"),appname,name,desc)
|
134
|
+
copy_file(File.join(TEMPLATEDIR,"Create.haml"),File.join(appname,"App","Views","WebSamples","Create.haml"),appname,name,desc)
|
135
|
+
copy_file(File.join(TEMPLATEDIR,"Delete.haml"),File.join(appname,"App","Views","WebSamples","Delete.haml"),appname,name,desc)
|
136
|
+
copy_file(File.join(TEMPLATEDIR,"Edit.haml"),File.join(appname,"App","Views","WebSamples","Edit.haml"),appname,name,desc)
|
137
|
+
copy_file(File.join(TEMPLATEDIR,"Index.haml"),File.join(appname,"App","Views","WebSamples","Index.haml"),appname,name,desc)
|
138
|
+
copy_file(File.join(TEMPLATEDIR,"Show.haml"),File.join(appname,"App","Views","WebSamples","Show.haml"),appname,name,desc)
|
139
|
+
copy_file(File.join(TEMPLATEDIR,"WebSamplesControllerTests.cs"),File.join(appname+".Tests","Tests","Web","Controllers","WebSamplesControllerTests.cs"),appname,name,desc)
|
140
|
+
else
|
141
|
+
puts 'S#aml ERROR: unknown generate argument'
|
142
|
+
end
|
143
|
+
else
|
144
|
+
puts 'S#aml ERROR: no name specified'
|
145
|
+
end
|
146
|
+
when "compile"
|
147
|
+
appname = getappname
|
148
|
+
puts "Copying libraries"
|
149
|
+
begin
|
150
|
+
FileUtils.rm_r(File.join(appname,"bin"))
|
151
|
+
rescue Exception => e
|
152
|
+
end
|
153
|
+
FileUtils.cp_r("libraries",File.join(appname,"bin"))
|
154
|
+
puts "Compiling using xbuild"
|
155
|
+
system("xbuild #{appname}.sln")
|
156
|
+
puts "Compiling stylesheets"
|
157
|
+
Dir.chdir(appname) do
|
158
|
+
system("compass --update -c Config/compass_config.rb")
|
159
|
+
end
|
160
|
+
when "server"
|
161
|
+
puts "Starting xsp2"
|
162
|
+
appname = getappname
|
163
|
+
Dir.chdir(appname) do
|
164
|
+
puts "Changed directory to #{Dir.pwd}"
|
165
|
+
puts "Starting xsp2 #{ARGV.join(" ")}"
|
166
|
+
system("xsp2 #{ARGV.join(" ")}")
|
167
|
+
puts "Done..."
|
168
|
+
end
|
169
|
+
else
|
170
|
+
puts 'S#aml ERROR: unknown command'
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Shaml
|
5
|
+
class MonoLoader
|
6
|
+
def initialize
|
7
|
+
@mono_command = '/bin/mono'
|
8
|
+
@mono_directory = '/usr'
|
9
|
+
@mono_lib_directory = '/lib'
|
10
|
+
@csharp_command = '/mono/2.0/csharp.exe'
|
11
|
+
@gsharp_command = '/gsharp/gsharp.exe'
|
12
|
+
@config_dir = '~/.config'
|
13
|
+
@init_script_name = 'shaml.cs'
|
14
|
+
|
15
|
+
# get mono path for Windows
|
16
|
+
if RbConfig::CONFIG['host_os'] =~ /mswin|windows|cygwin|mingw/i
|
17
|
+
begin
|
18
|
+
require 'win32/registry'
|
19
|
+
# Check in default location
|
20
|
+
base = "Software\\Novell\\Mono\\"
|
21
|
+
begin
|
22
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open(base) do |reg|
|
23
|
+
end
|
24
|
+
# if running ruby 64-bit and mono 32-bit, change the registry search location
|
25
|
+
rescue Win32::Registry::Error
|
26
|
+
base = "Software\\Wow6432Node\\Novell\\Mono\\"
|
27
|
+
end
|
28
|
+
Win32::Registry::HKEY_LOCAL_MACHINE.open(base) do |reg|
|
29
|
+
monoversion = reg.read_s("DefaultCLR")
|
30
|
+
reg.open(monoversion) do |r|
|
31
|
+
@mono_directory = r.read_s("SdkInstallRoot")
|
32
|
+
@mono_lib_directory = r.read_s("FrameworkAssemblyDirectory")
|
33
|
+
@mono_command = "\\bin\\mono"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
Win32::Registry::HKEY_CURRENT_USER.open("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders") do |reg|
|
37
|
+
@config_dir = reg.read_s_expand("AppData")
|
38
|
+
end
|
39
|
+
rescue Exception => e
|
40
|
+
STDERR.puts "Couldn't determine mono location under Windows!"
|
41
|
+
STDERR.puts e.inspect
|
42
|
+
end
|
43
|
+
else
|
44
|
+
if ENV['MONO_PREFIX'] != nil then
|
45
|
+
@mono_directory = ENV['MONO_PREFIX']
|
46
|
+
@mono_lib_directory = File.join(@mono_directory,"lib")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# create a file that will be executed before the interpreter starts
|
52
|
+
def create_init_script(init_script, name)
|
53
|
+
if init_script then
|
54
|
+
csconfig = File.join(@config_dir,name)
|
55
|
+
FileUtils::mkdir_p(csconfig)
|
56
|
+
csfile = File.join(csconfig,@init_script_name);
|
57
|
+
File.open(csfile,"w+") do |f|
|
58
|
+
f.write init_script
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# remove the file
|
64
|
+
def delete_init_script(init_script, name)
|
65
|
+
if init_script then
|
66
|
+
csconfig = File.join(@config_dir,name)
|
67
|
+
csfile = File.join(csconfig,@init_script_name);
|
68
|
+
FileUtils::rm_rf(csfile)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# run csharp with an optional initialization script
|
73
|
+
def load_csharp(init_script = nil)
|
74
|
+
create_init_script(init_script,"csharp")
|
75
|
+
puts "Mono executable: \"#{File.join(@mono_directory,@mono_command)}\""
|
76
|
+
cs = File.join(@mono_lib_directory,@csharp_command)
|
77
|
+
puts "CSharp executable: \"#{cs}\""
|
78
|
+
system("\"#{File.join(@mono_directory,@mono_command)}\" \"#{cs}\"")
|
79
|
+
delete_init_script("csharp")
|
80
|
+
end
|
81
|
+
|
82
|
+
# run gsharp with an optional initialization script
|
83
|
+
def load_gsharp(init_script = nil)
|
84
|
+
create_init_script(init_script,"gsharp")
|
85
|
+
puts "Mono executable: \"#{File.join(@mono_directory,@mono_command)}\""
|
86
|
+
gs = File.join(@mono_lib_directory,@gsharp_command)
|
87
|
+
puts "GSharp executable: \"#{gs}\""
|
88
|
+
system("\"#{File.join(@mono_directory,@mono_command)}\" \"#{gs}\"")
|
89
|
+
delete_init_script("gsharp")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/shaml/shaml.rb
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
%div
|
2
|
+
%h2 Delete WebSample
|
3
|
+
%p Are you sure?
|
4
|
+
- using (Html.BeginForm<WebSamplesController>(c => c.DeleteConfirmed(ViewData.Model.Id)))
|
5
|
+
= Html.AntiForgeryToken()
|
6
|
+
%input{ type="submit" value="Yes" }
|
7
|
+
%input{ type="button" name="No" value="No" onclick="javascript:history.go(-1);"}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
%div
|
2
|
+
%h2 WebSamples
|
3
|
+
- if (ViewContext.TempData["message"] != null)
|
4
|
+
%p= ViewContext.TempData["message"]
|
5
|
+
%table
|
6
|
+
%thead
|
7
|
+
%tr
|
8
|
+
// TODO: List of properties begin
|
9
|
+
%th Property
|
10
|
+
// TODO: List of properties end
|
11
|
+
%th{ colspan=3 } Action
|
12
|
+
%tbody
|
13
|
+
- foreach (WebSample websample in ViewData.Model)
|
14
|
+
%tr
|
15
|
+
// TODO: List of properties begin
|
16
|
+
%td= websample.Property
|
17
|
+
// TODO: List of properties end
|
18
|
+
%td
|
19
|
+
= Html.ActionLink<WebSamplesController>( c => c.Show( websample.Id ), "Details ")
|
20
|
+
%td
|
21
|
+
= Html.ActionLink<WebSamplesController>( c => c.Edit( websample.Id ), "Edit")
|
22
|
+
%td
|
23
|
+
= Html.ActionLink<WebSamplesController>( c => c.Delete( websample.Id), "Delete")
|
24
|
+
%p= Html.ActionLink<WebSamplesController>(c => c.Create(), "Create New WebSample")
|
@@ -0,0 +1,14 @@
|
|
1
|
+
using NHibernate.Validator.Constraints;
|
2
|
+
using Shaml.Core.DomainModel;
|
3
|
+
using Shaml.Core.PersistenceSupport;
|
4
|
+
using System;
|
5
|
+
|
6
|
+
namespace WebBase.Core
|
7
|
+
{
|
8
|
+
public class WebSample : Entity
|
9
|
+
{
|
10
|
+
public WebSample() { }
|
11
|
+
|
12
|
+
// TODO: Add Properties to the Domain Object
|
13
|
+
}
|
14
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
using NUnit.Framework;
|
2
|
+
using WebBase.Core;
|
3
|
+
using Shaml.Testing;
|
4
|
+
|
5
|
+
namespace Tests.Blog.Core
|
6
|
+
{
|
7
|
+
[TestFixture]
|
8
|
+
public class WebSampleTests
|
9
|
+
{
|
10
|
+
[Test]
|
11
|
+
public void CanCompareWebSamples() {
|
12
|
+
WebSample instance = new WebSample();
|
13
|
+
EntityIdSetter.SetIdOf<int>(instance, 1);
|
14
|
+
|
15
|
+
WebSample instanceToCompareTo = new WebSample();
|
16
|
+
EntityIdSetter.SetIdOf<int>(instanceToCompareTo, 1);
|
17
|
+
|
18
|
+
instance.ShouldEqual(instanceToCompareTo);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,140 @@
|
|
1
|
+
using System.Web.Mvc;
|
2
|
+
using WebBase.Core;
|
3
|
+
using SharpArch.Core.PersistenceSupport;
|
4
|
+
using SharpArch.Core.DomainModel;
|
5
|
+
using System.Collections.Generic;
|
6
|
+
using System;
|
7
|
+
using SharpArch.Web.NHibernate;
|
8
|
+
using NHibernate.Validator.Engine;
|
9
|
+
using System.Text;
|
10
|
+
using SharpArch.Web.CommonValidator;
|
11
|
+
using SharpArch.Core;
|
12
|
+
|
13
|
+
namespace WebBase.Controllers
|
14
|
+
{
|
15
|
+
[HandleError]
|
16
|
+
public class WebSamplesController : Controller
|
17
|
+
{
|
18
|
+
public WebSamplesController(IRepository<WebSample> websampleRepository) {
|
19
|
+
Check.Require(websampleRepository != null, "websampleRepository may not be null");
|
20
|
+
|
21
|
+
this.websampleRepository = websampleRepository;
|
22
|
+
}
|
23
|
+
|
24
|
+
[Transaction]
|
25
|
+
public ActionResult Index() {
|
26
|
+
IList<WebSample> websamples = websampleRepository.GetAll();
|
27
|
+
return View(websamples);
|
28
|
+
}
|
29
|
+
|
30
|
+
[Transaction]
|
31
|
+
public ActionResult Show(int id) {
|
32
|
+
WebSample websample = websampleRepository.Get(id);
|
33
|
+
return View(websample);
|
34
|
+
}
|
35
|
+
|
36
|
+
public ActionResult Create() {
|
37
|
+
WebSampleFormViewModel viewModel = WebSampleFormViewModel.CreateWebSampleFormViewModel();
|
38
|
+
return View(viewModel);
|
39
|
+
}
|
40
|
+
|
41
|
+
[ValidateAntiForgeryToken]
|
42
|
+
[Transaction]
|
43
|
+
[AcceptVerbs(HttpVerbs.Post)]
|
44
|
+
public ActionResult Create(WebSample websample) {
|
45
|
+
if (ViewData.ModelState.IsValid && websample.IsValid()) {
|
46
|
+
websampleRepository.SaveOrUpdate(websample);
|
47
|
+
|
48
|
+
TempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()] =
|
49
|
+
"The websample was successfully created.";
|
50
|
+
return RedirectToAction("Index");
|
51
|
+
}
|
52
|
+
|
53
|
+
WebSampleFormViewModel viewModel = WebSampleFormViewModel.CreateWebSampleFormViewModel();
|
54
|
+
viewModel.WebSample = websample;
|
55
|
+
return View(viewModel);
|
56
|
+
}
|
57
|
+
|
58
|
+
[Transaction]
|
59
|
+
public ActionResult Edit(int id) {
|
60
|
+
WebSampleFormViewModel viewModel = WebSampleFormViewModel.CreateWebSampleFormViewModel();
|
61
|
+
viewModel.WebSample = websampleRepository.Get(id);
|
62
|
+
return View(viewModel);
|
63
|
+
}
|
64
|
+
|
65
|
+
[ValidateAntiForgeryToken]
|
66
|
+
[Transaction]
|
67
|
+
[AcceptVerbs(HttpVerbs.Post)]
|
68
|
+
public ActionResult Edit(WebSample websample) {
|
69
|
+
WebSample websampleToUpdate = websampleRepository.Get(websample.Id);
|
70
|
+
TransferFormValuesTo(websampleToUpdate, websample);
|
71
|
+
|
72
|
+
if (ViewData.ModelState.IsValid && websample.IsValid()) {
|
73
|
+
TempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()] =
|
74
|
+
"The websample was successfully updated.";
|
75
|
+
return RedirectToAction("Index");
|
76
|
+
}
|
77
|
+
else {
|
78
|
+
websampleRepository.DbContext.RollbackTransaction();
|
79
|
+
|
80
|
+
WebSampleFormViewModel viewModel = WebSampleFormViewModel.CreateWebSampleFormViewModel();
|
81
|
+
viewModel.WebSample = websample;
|
82
|
+
return View(viewModel);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
private void TransferFormValuesTo(WebSample websampleToUpdate, WebSample websampleFromForm) {
|
87
|
+
// TODO: Add copy methods
|
88
|
+
}
|
89
|
+
|
90
|
+
[ValidateAntiForgeryToken]
|
91
|
+
[Transaction]
|
92
|
+
[AcceptVerbs(HttpVerbs.Post)]
|
93
|
+
public ActionResult Delete(int id) {
|
94
|
+
string resultMessage = "The websample was successfully deleted.";
|
95
|
+
WebSample websampleToDelete = websampleRepository.Get(id);
|
96
|
+
|
97
|
+
if (websampleToDelete != null) {
|
98
|
+
websampleRepository.Delete(websampleToDelete);
|
99
|
+
|
100
|
+
try {
|
101
|
+
websampleRepository.DbContext.CommitChanges();
|
102
|
+
}
|
103
|
+
catch {
|
104
|
+
resultMessage = "A problem was encountered preventing the websample from being deleted. " +
|
105
|
+
"Another item likely depends on this websample.";
|
106
|
+
websampleRepository.DbContext.RollbackTransaction();
|
107
|
+
}
|
108
|
+
}
|
109
|
+
else {
|
110
|
+
resultMessage = "The websample could not be found for deletion. It may already have been deleted.";
|
111
|
+
}
|
112
|
+
|
113
|
+
TempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()] = resultMessage;
|
114
|
+
return RedirectToAction("Index");
|
115
|
+
}
|
116
|
+
|
117
|
+
/// <summary>
|
118
|
+
/// Holds data to be passed to the WebSample form for creates and edits
|
119
|
+
/// </summary>
|
120
|
+
public class WebSampleFormViewModel
|
121
|
+
{
|
122
|
+
private WebSampleFormViewModel() { }
|
123
|
+
|
124
|
+
/// <summary>
|
125
|
+
/// Creation method for creating the view model. Services may be passed to the creation
|
126
|
+
/// method to instantiate items such as lists for drop down boxes.
|
127
|
+
/// </summary>
|
128
|
+
public static WebSampleFormViewModel CreateWebSampleFormViewModel() {
|
129
|
+
WebSampleFormViewModel viewModel = new WebSampleFormViewModel();
|
130
|
+
|
131
|
+
return viewModel;
|
132
|
+
}
|
133
|
+
|
134
|
+
public WebSample WebSample { get; internal set; }
|
135
|
+
}
|
136
|
+
|
137
|
+
private readonly IRepository<WebSample> websampleRepository;
|
138
|
+
}
|
139
|
+
}
|
140
|
+
|
@@ -0,0 +1,147 @@
|
|
1
|
+
using System;
|
2
|
+
using MvcContrib.TestHelper;
|
3
|
+
using NUnit.Framework;
|
4
|
+
using Rhino.Mocks;
|
5
|
+
using Shaml.Core.PersistenceSupport;
|
6
|
+
using Shaml.Testing;
|
7
|
+
using System.Collections.Generic;
|
8
|
+
using System.Web.Mvc;
|
9
|
+
using WebBase;
|
10
|
+
using WebBase.Config;
|
11
|
+
using WebBase.Core;
|
12
|
+
using WebBase.Controllers;
|
13
|
+
|
14
|
+
namespace Tests.Blog.Web.Controllers
|
15
|
+
{
|
16
|
+
[TestFixture]
|
17
|
+
public class WebSamplesControllerTests
|
18
|
+
{
|
19
|
+
[SetUp]
|
20
|
+
public void SetUp() {
|
21
|
+
ServiceLocatorInitializer.Init();
|
22
|
+
controller = new WebSamplesController(CreateMockWebSampleRepository());
|
23
|
+
}
|
24
|
+
|
25
|
+
/// <summary>
|
26
|
+
/// Add a couple of objects to the list within CreateWebSamples and change the
|
27
|
+
/// "ShouldEqual(0)" within this test to the respective number.
|
28
|
+
/// </summary>
|
29
|
+
[Test]
|
30
|
+
public void CanListWebSamples() {
|
31
|
+
ViewResult result = controller.Index().AssertViewRendered();
|
32
|
+
|
33
|
+
result.ViewData.Model.ShouldNotBeNull();
|
34
|
+
(result.ViewData.Model as List<WebSample>).Count.ShouldEqual(0);
|
35
|
+
}
|
36
|
+
|
37
|
+
[Test]
|
38
|
+
public void CanShowWebSample() {
|
39
|
+
ViewResult result = controller.Show(1).AssertViewRendered();
|
40
|
+
|
41
|
+
result.ViewData.ShouldNotBeNull();
|
42
|
+
|
43
|
+
(result.ViewData.Model as WebSample).Id.ShouldEqual(1);
|
44
|
+
}
|
45
|
+
|
46
|
+
[Test]
|
47
|
+
public void CanInitWebSampleCreation() {
|
48
|
+
ViewResult result = controller.Create().AssertViewRendered();
|
49
|
+
|
50
|
+
result.ViewData.Model.ShouldNotBeNull();
|
51
|
+
result.ViewData.Model.ShouldBeOfType(typeof(WebSamplesController.WebSampleFormViewModel));
|
52
|
+
(result.ViewData.Model as WebSamplesController.WebSampleFormViewModel).WebSample.ShouldBeNull();
|
53
|
+
}
|
54
|
+
|
55
|
+
[Test]
|
56
|
+
public void CanEnsureWebSampleCreationIsValid() {
|
57
|
+
WebSample websampleFromForm = new WebSample();
|
58
|
+
ViewResult result = controller.Create(websampleFromForm).AssertViewRendered();
|
59
|
+
|
60
|
+
result.ViewData.Model.ShouldNotBeNull();
|
61
|
+
result.ViewData.Model.ShouldBeOfType(typeof(WebSamplesController.WebSampleFormViewModel));
|
62
|
+
}
|
63
|
+
|
64
|
+
[Test]
|
65
|
+
public void CanCreateWebSample() {
|
66
|
+
WebSample websampleFromForm = CreateTransientWebSample();
|
67
|
+
RedirectToRouteResult redirectResult = controller.Create(websampleFromForm)
|
68
|
+
.AssertActionRedirect().ToAction("Index");
|
69
|
+
controller.TempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()].ToString()
|
70
|
+
.ShouldContain("was successfully created");
|
71
|
+
}
|
72
|
+
|
73
|
+
[Test]
|
74
|
+
public void CanUpdateWebSample() {
|
75
|
+
WebSample websampleFromForm = CreateTransientWebSample();
|
76
|
+
EntityIdSetter.SetIdOf<int>(websampleFromForm, 1);
|
77
|
+
RedirectToRouteResult redirectResult = controller.Edit(websampleFromForm)
|
78
|
+
.AssertActionRedirect().ToAction("Index");
|
79
|
+
controller.TempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()].ToString()
|
80
|
+
.ShouldContain("was successfully updated");
|
81
|
+
}
|
82
|
+
|
83
|
+
[Test]
|
84
|
+
public void CanInitWebSampleEdit() {
|
85
|
+
ViewResult result = controller.Edit(1).AssertViewRendered();
|
86
|
+
|
87
|
+
result.ViewData.Model.ShouldNotBeNull();
|
88
|
+
result.ViewData.Model.ShouldBeOfType(typeof(WebSamplesController.WebSampleFormViewModel));
|
89
|
+
(result.ViewData.Model as WebSamplesController.WebSampleFormViewModel).WebSample.Id.ShouldEqual(1);
|
90
|
+
}
|
91
|
+
|
92
|
+
[Test]
|
93
|
+
public void CanDeleteWebSample() {
|
94
|
+
RedirectToRouteResult redirectResult = controller.Delete(1)
|
95
|
+
.AssertActionRedirect().ToAction("Index");
|
96
|
+
|
97
|
+
controller.TempData[ControllerEnums.GlobalViewDataProperty.PageMessage.ToString()].ToString()
|
98
|
+
.ShouldContain("was successfully deleted");
|
99
|
+
}
|
100
|
+
|
101
|
+
#region Create Mock WebSample Repository
|
102
|
+
|
103
|
+
private IRepository<WebSample> CreateMockWebSampleRepository() {
|
104
|
+
|
105
|
+
IRepository<WebSample> mockedRepository = MockRepository.GenerateMock<IRepository<WebSample>>();
|
106
|
+
mockedRepository.Expect(mr => mr.GetAll()).Return(CreateWebSamples());
|
107
|
+
mockedRepository.Expect(mr => mr.Get(1)).IgnoreArguments().Return(CreateWebSample());
|
108
|
+
mockedRepository.Expect(mr => mr.SaveOrUpdate(null)).IgnoreArguments().Return(CreateWebSample());
|
109
|
+
mockedRepository.Expect(mr => mr.Delete(null)).IgnoreArguments();
|
110
|
+
|
111
|
+
IDbContext mockedDbContext = MockRepository.GenerateStub<IDbContext>();
|
112
|
+
mockedDbContext.Stub(c => c.CommitChanges());
|
113
|
+
mockedRepository.Stub(mr => mr.DbContext).Return(mockedDbContext);
|
114
|
+
|
115
|
+
return mockedRepository;
|
116
|
+
}
|
117
|
+
|
118
|
+
private WebSample CreateWebSample() {
|
119
|
+
WebSample websample = CreateTransientWebSample();
|
120
|
+
EntityIdSetter.SetIdOf<int>(websample, 1);
|
121
|
+
return websample;
|
122
|
+
}
|
123
|
+
|
124
|
+
private List<WebSample> CreateWebSamples() {
|
125
|
+
List<WebSample> websamples = new List<WebSample>();
|
126
|
+
|
127
|
+
// Create a number of domain object instances here and add them to the list
|
128
|
+
|
129
|
+
return websamples;
|
130
|
+
}
|
131
|
+
|
132
|
+
#endregion
|
133
|
+
|
134
|
+
/// <summary>
|
135
|
+
/// Creates a valid, transient WebSample; typical of something retrieved back from a form submission
|
136
|
+
/// </summary>
|
137
|
+
private WebSample CreateTransientWebSample() {
|
138
|
+
WebSample websample = new WebSample() {
|
139
|
+
//TODO: Create the properties of the object
|
140
|
+
};
|
141
|
+
|
142
|
+
return websample;
|
143
|
+
}
|
144
|
+
|
145
|
+
private WebSamplesController controller;
|
146
|
+
}
|
147
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
@type=WebSample
|
2
|
+
= Html.ValidationSummary()
|
3
|
+
- using (Html.BeginForm())
|
4
|
+
= Html.AntiForgeryToken()
|
5
|
+
= Html.Hidden("id", (ViewData.Model == null) ? 0 : (ViewData.Model).Id)
|
6
|
+
%ul
|
7
|
+
// TODO: List of properties begin
|
8
|
+
%li
|
9
|
+
%label{ for="WebSample_Property" }Property:
|
10
|
+
%div
|
11
|
+
= Html.TextBox("WebSample.Property", ViewData.Model != null ? ViewData.Model.Property.ToString() : "")
|
12
|
+
= Html.ValidationMessage("WebSample.Property")
|
13
|
+
// TODO: List of properties end
|
14
|
+
%li
|
15
|
+
%input{ type="submit" name="btnSave" value="Save WebSample"}/
|
16
|
+
%button{ name="btnCancel" onClick="window.location.href = '/WebSamples';"} Cancel
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: shaml
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: true
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
- alpha
|
10
|
+
version: 0.5.0.alpha
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Zsolt Sz. Sztupak
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-04-01 00:00:00 +02:00
|
19
|
+
default_executable: shaml
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rubyzip
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 9
|
31
|
+
- 1
|
32
|
+
version: 0.9.1
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: compass
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
- 6
|
45
|
+
- 15
|
46
|
+
version: 0.6.15
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
49
|
+
description: Shaml is an ASP.NET MVC 2 framework with NHibernate 2.1 for mono 2.4.4+
|
50
|
+
email: mail@sztupy.hu
|
51
|
+
executables:
|
52
|
+
- shaml
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files: []
|
56
|
+
|
57
|
+
files:
|
58
|
+
- bin/shaml
|
59
|
+
- lib/shaml/templates/shaml_base_template.dat
|
60
|
+
- lib/shaml/command.rb
|
61
|
+
- lib/shaml/mono_load.rb
|
62
|
+
- lib/shaml/shaml.rb
|
63
|
+
- lib/shaml/templates/Create.haml
|
64
|
+
- lib/shaml/templates/Delete.haml
|
65
|
+
- lib/shaml/templates/Edit.haml
|
66
|
+
- lib/shaml/templates/Index.haml
|
67
|
+
- lib/shaml/templates/Show.haml
|
68
|
+
- lib/shaml/templates/_WebSampleForm.haml
|
69
|
+
- lib/shaml/templates/WebSample.cs
|
70
|
+
- lib/shaml/templates/WebSamplesController.cs
|
71
|
+
- lib/shaml/templates/WebSamplesControllerTests.cs
|
72
|
+
- lib/shaml/templates/WebSampleTests.cs
|
73
|
+
has_rdoc: true
|
74
|
+
homepage: http://code.google.com/p/shaml-architecture/
|
75
|
+
licenses: []
|
76
|
+
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options:
|
79
|
+
- --charset=UTF-8
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
requirements: []
|
97
|
+
|
98
|
+
rubyforge_project: shaml
|
99
|
+
rubygems_version: 1.3.6
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: ASP.NET MVC on mono
|
103
|
+
test_files: []
|
104
|
+
|