gendalf 0.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +3 -1
- data/Manifest +6 -2
- data/Rakefile +10 -1
- data/gendalf.gemspec +19 -10
- data/lib/controllers/wizard_controller.rb +97 -0
- data/lib/extensions/routes.rb +13 -0
- data/lib/gendalf.rb +5 -0
- data/lib/models/wizard_model.rb +92 -0
- metadata +61 -16
- data/README +0 -0
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/Rakefile
CHANGED
@@ -1,2 +1,11 @@
|
|
1
1
|
require 'echoe'
|
2
|
-
Echoe.new('gendalf')
|
2
|
+
Echoe.new('gendalf') do |p|
|
3
|
+
p.project = 'gendalf'
|
4
|
+
p.author = 'Ivan Kasatenko'
|
5
|
+
p.email = 'sky.31338@gmail.com'
|
6
|
+
p.summary = 'Trivial gem to support wizard application style creation.'
|
7
|
+
p.url = 'http://github.com/skywriter/gendalf'
|
8
|
+
p.runtime_dependencies = ['activemodel', 'actionpack']
|
9
|
+
p.development_dependencies = ['echoe']
|
10
|
+
p.retain_gemspec = true
|
11
|
+
end
|
data/gendalf.gemspec
CHANGED
@@ -2,29 +2,38 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{gendalf}
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = [""]
|
9
|
-
s.date = %q{2011-02-
|
10
|
-
s.description = %q{}
|
11
|
-
s.email = %q{}
|
12
|
-
s.extra_rdoc_files = ["CHANGELOG", "
|
13
|
-
s.files = ["CHANGELOG", "
|
14
|
-
s.homepage = %q{}
|
15
|
-
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Gendalf"
|
8
|
+
s.authors = ["Ivan Kasatenko"]
|
9
|
+
s.date = %q{2011-02-16}
|
10
|
+
s.description = %q{Trivial gem to support wizard application style creation.}
|
11
|
+
s.email = %q{sky.31338@gmail.com}
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "lib/controllers/wizard_controller.rb", "lib/extensions/routes.rb", "lib/gendalf.rb", "lib/models/wizard_model.rb"]
|
13
|
+
s.files = ["CHANGELOG", "Manifest", "Rakefile", "gendalf.gemspec", "lib/controllers/wizard_controller.rb", "lib/extensions/routes.rb", "lib/gendalf.rb", "lib/models/wizard_model.rb"]
|
14
|
+
s.homepage = %q{http://github.com/skywriter/gendalf}
|
15
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Gendalf"]
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
s.rubyforge_project = %q{gendalf}
|
18
18
|
s.rubygems_version = %q{1.3.7}
|
19
|
-
s.summary = %q{}
|
19
|
+
s.summary = %q{Trivial gem to support wizard application style creation.}
|
20
20
|
|
21
21
|
if s.respond_to? :specification_version then
|
22
22
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
23
23
|
s.specification_version = 3
|
24
24
|
|
25
25
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_runtime_dependency(%q<activemodel>, [">= 0"])
|
27
|
+
s.add_runtime_dependency(%q<actionpack>, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<echoe>, [">= 0"])
|
26
29
|
else
|
30
|
+
s.add_dependency(%q<activemodel>, [">= 0"])
|
31
|
+
s.add_dependency(%q<actionpack>, [">= 0"])
|
32
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
27
33
|
end
|
28
34
|
else
|
35
|
+
s.add_dependency(%q<activemodel>, [">= 0"])
|
36
|
+
s.add_dependency(%q<actionpack>, [">= 0"])
|
37
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
29
38
|
end
|
30
39
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Gendalf
|
2
|
+
|
3
|
+
class WizardController < ActionController::Base
|
4
|
+
protect_from_forgery
|
5
|
+
|
6
|
+
before_filter :redirect_to_current_step
|
7
|
+
|
8
|
+
def model
|
9
|
+
@@model_name.to_s.camelize.constantize.steps[step_no]
|
10
|
+
end
|
11
|
+
|
12
|
+
def step
|
13
|
+
@step = model.new(params[param_name])
|
14
|
+
send step_action_name
|
15
|
+
render :action => step_action_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def step_submit
|
19
|
+
if proceed_custom_or_default_step_submit
|
20
|
+
if respond_to?(step_action_name(step_no+1))
|
21
|
+
self.current_step = step_no+1
|
22
|
+
redirect_to wizard_path(self.current_step)
|
23
|
+
end
|
24
|
+
else
|
25
|
+
render :action => step_action_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class << self
|
30
|
+
def set_model_name(model_name)
|
31
|
+
@@model_name = model_name
|
32
|
+
end
|
33
|
+
|
34
|
+
def model_name
|
35
|
+
@@model_name
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def default
|
40
|
+
redirect_to custom_wizard_path(current_step)
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def wizard_model
|
46
|
+
raise "Please, implement 'wizard_model' method in #{self.class.name}"
|
47
|
+
end
|
48
|
+
|
49
|
+
def current_step
|
50
|
+
raise "Please, implement 'current_step' method in #{self.class.name}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def current_step=(step)
|
54
|
+
raise "Please, implement 'current_step=' method in #{self.class.name}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def wizard_path(step)
|
58
|
+
send("#{self.class.name.gsub('Controller', '').underscore}_path", :step => step+1)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def redirect_to_current_step
|
64
|
+
redirect_to wizard_path(current_step) unless step_no == current_step
|
65
|
+
end
|
66
|
+
|
67
|
+
def param_name
|
68
|
+
model.name.underscore
|
69
|
+
end
|
70
|
+
|
71
|
+
def proceed_custom_or_default_step_submit
|
72
|
+
respond_to?("#{step_action_name}_submit") ?
|
73
|
+
send("#{step_action_name}_submit") :
|
74
|
+
default_step_submit
|
75
|
+
end
|
76
|
+
|
77
|
+
def default_step_submit
|
78
|
+
@step = model.new(params[param_name])
|
79
|
+
if @step.valid?
|
80
|
+
wizard_model.merge_step!(@step)
|
81
|
+
true
|
82
|
+
else
|
83
|
+
flash[:error] = @step.errors.full_messages
|
84
|
+
false
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def step_no
|
89
|
+
params[:step].to_i-1
|
90
|
+
end
|
91
|
+
|
92
|
+
def step_action_name(action_step_no=nil)
|
93
|
+
"step#{action_step_no || step_no}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class ActionDispatch::Routing::Mapper
|
2
|
+
def wizard(url, controller, total_steps)
|
3
|
+
match "#{url}/step:step" => "#{controller.to_s.underscore}#step", :via => :get, :as => controller.to_s.underscore.to_sym
|
4
|
+
match "#{url}/step:step" => "#{controller.to_s.underscore}#step_submit", :via => :post, :as => controller.to_s.underscore.to_sym
|
5
|
+
match "#{url}" => "#{controller.to_s.underscore}#default", :via => :get
|
6
|
+
|
7
|
+
|
8
|
+
model_prefix = "#{controller.to_s.camelcase}Controller".constantize.model_name.to_s.underscore
|
9
|
+
total_steps.times do |idx|
|
10
|
+
match "#{url}/step#{idx+1}" => "#{controller.to_s.underscore}#step", :via => :get, :as => "#{model_prefix}_#{idx}_steps"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/gendalf.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
module Gendalf
|
2
|
+
|
3
|
+
class WizardModel
|
4
|
+
include ActiveModel::Validations
|
5
|
+
include ActiveModel::Serialization
|
6
|
+
|
7
|
+
attr_accessor :step
|
8
|
+
|
9
|
+
def merge_step!(step_model)
|
10
|
+
step_model.class.step_attributes.each do |attrib|
|
11
|
+
send("#{attrib}=", step_model.send(attrib))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# Defines a step
|
17
|
+
def define_step(step_no, step_attributes, &validations_block)
|
18
|
+
define_attributes step_attributes
|
19
|
+
|
20
|
+
@steps ||= []
|
21
|
+
@steps[step_no] = step_model_class(step_no, step_attributes, &validations_block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def define_null_step(step_no)
|
25
|
+
define_step step_no, [] do
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method :define_final_step, :define_null_step
|
30
|
+
|
31
|
+
def steps
|
32
|
+
@steps
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
# Defines steps attributes.
|
37
|
+
def define_attributes(step_attributes)
|
38
|
+
[*step_attributes].each do |attrib|
|
39
|
+
instance_eval do
|
40
|
+
attr_accessor attrib.to_sym
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Create a step model class (used for validations and holding intermediate step values)
|
46
|
+
def step_model_class(step_no, step_attributes, &validations_block)
|
47
|
+
step_model_class = Class.new
|
48
|
+
|
49
|
+
# make its name accessible to itself
|
50
|
+
step_model_class.instance_variable_set :@name, "#{self.name}_#{step_no}_Step"
|
51
|
+
# ... and save step attributes for future merging
|
52
|
+
step_model_class.instance_variable_set :@step_attributes, [*step_attributes]
|
53
|
+
|
54
|
+
# make it an proper ActiveModel
|
55
|
+
step_model_class.instance_eval do
|
56
|
+
include ActiveModel::Validations
|
57
|
+
include ActiveModel::Serialization
|
58
|
+
include ActiveModel::Conversion
|
59
|
+
|
60
|
+
def name; @name; end
|
61
|
+
def step_attributes; @step_attributes; end
|
62
|
+
end
|
63
|
+
|
64
|
+
step_model_class.class_eval do
|
65
|
+
def initialize(attributes = {})
|
66
|
+
return unless attributes.kind_of? Hash
|
67
|
+
attributes.each do |name, value|
|
68
|
+
send("#{name}=", value)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def persisted?
|
73
|
+
false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# define appropriate attributes for the step
|
78
|
+
[*step_attributes].each do |attrib|
|
79
|
+
step_model_class.instance_eval do
|
80
|
+
attr_accessor attrib.to_sym
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# give user a chance to add the validations
|
85
|
+
step_model_class.instance_eval(&validations_block)
|
86
|
+
|
87
|
+
return step_model_class
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
metadata
CHANGED
@@ -1,40 +1,87 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gendalf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
|
-
-
|
12
|
+
- Ivan Kasatenko
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-02-
|
17
|
+
date: 2011-02-16 00:00:00 +03:00
|
18
18
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: activemodel
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: actionpack
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: echoe
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
62
|
+
description: Trivial gem to support wizard application style creation.
|
63
|
+
email: sky.31338@gmail.com
|
23
64
|
executables: []
|
24
65
|
|
25
66
|
extensions: []
|
26
67
|
|
27
68
|
extra_rdoc_files:
|
28
69
|
- CHANGELOG
|
29
|
-
-
|
70
|
+
- lib/controllers/wizard_controller.rb
|
71
|
+
- lib/extensions/routes.rb
|
72
|
+
- lib/gendalf.rb
|
73
|
+
- lib/models/wizard_model.rb
|
30
74
|
files:
|
31
75
|
- CHANGELOG
|
32
|
-
- README
|
33
|
-
- Rakefile
|
34
76
|
- Manifest
|
77
|
+
- Rakefile
|
35
78
|
- gendalf.gemspec
|
79
|
+
- lib/controllers/wizard_controller.rb
|
80
|
+
- lib/extensions/routes.rb
|
81
|
+
- lib/gendalf.rb
|
82
|
+
- lib/models/wizard_model.rb
|
36
83
|
has_rdoc: true
|
37
|
-
homepage:
|
84
|
+
homepage: http://github.com/skywriter/gendalf
|
38
85
|
licenses: []
|
39
86
|
|
40
87
|
post_install_message:
|
@@ -43,8 +90,6 @@ rdoc_options:
|
|
43
90
|
- --inline-source
|
44
91
|
- --title
|
45
92
|
- Gendalf
|
46
|
-
- --main
|
47
|
-
- README
|
48
93
|
require_paths:
|
49
94
|
- lib
|
50
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -72,6 +117,6 @@ rubyforge_project: gendalf
|
|
72
117
|
rubygems_version: 1.3.7
|
73
118
|
signing_key:
|
74
119
|
specification_version: 3
|
75
|
-
summary:
|
120
|
+
summary: Trivial gem to support wizard application style creation.
|
76
121
|
test_files: []
|
77
122
|
|
data/README
DELETED
File without changes
|