mdd 3.0.2 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/app/helpers/mdwa_helper.rb +2 -1
- data/lib/generators/mdwa/association/association_generator.rb +1 -1
- data/lib/generators/mdwa/association/templates/migrate/many_to_many.rb +1 -1
- data/lib/generators/mdwa/association/templates/migrate/one_field.rb +2 -1
- data/lib/generators/mdwa/code/code_generator.rb +54 -22
- data/lib/generators/mdwa/code/templates/migration.rb +2 -1
- data/lib/generators/mdwa/entity/entity_generator.rb +1 -2
- data/lib/generators/mdwa/entity/templates/entity.rb +2 -1
- data/lib/generators/mdwa/from_requirements/from_requirements_generator.rb +56 -0
- data/lib/generators/mdwa/process/USAGE +4 -0
- data/lib/generators/mdwa/process/process_generator.rb +24 -0
- data/lib/generators/mdwa/process/templates/process.rb +49 -0
- data/lib/generators/mdwa/requirement/USAGE +4 -0
- data/lib/generators/mdwa/requirement/requirement_generator.rb +24 -0
- data/lib/generators/mdwa/requirement/templates/requirement.rb +21 -0
- data/lib/generators/mdwa/sandbox/sandbox_generator.rb +1 -1
- data/lib/generators/mdwa/sandbox/templates/app/assets/stylesheets/mdwa/template/backend.css.erb +2 -2
- data/lib/generators/mdwa/sandbox/templates/app/controllers/a/backend_controller.rb +2 -1
- data/lib/generators/mdwa/sandbox/templates/app/controllers/a/users/sessions_controller.rb +1 -1
- data/lib/generators/mdwa/sandbox/templates/app/controllers/public_controller.rb +1 -0
- data/lib/generators/mdwa/sandbox/templates/config/initializers/devise.rb +1 -0
- data/lib/generators/mdwa/sandbox/templates/config/initializers/mdwa_layout.rb +2 -1
- data/lib/generators/mdwa/sandbox/templates/config/locales/mdwa.en.yml +1 -1
- data/lib/generators/mdwa/sandbox/templates/db/migrate/devise_create_users.rb +1 -1
- data/lib/generators/mdwa/sandbox/templates/db/seeds.rb +1 -1
- data/lib/generators/mdwa/sandbox/templates/db/seeds/site.rb +1 -1
- data/lib/generators/mdwa/scaffold/scaffold_generator.rb +10 -3
- data/lib/generators/mdwa/scaffold/templates/controllers/ajax_controller.rb +2 -1
- data/lib/generators/mdwa/scaffold/templates/controllers/controller.rb +2 -1
- data/lib/generators/mdwa/scaffold/templates/db_migrate/migrate.rb +2 -1
- data/lib/generators/mdwa/scaffold/templates/models/model.rb +2 -1
- data/lib/generators/mdwa/scaffold/templates/models/module.rb +2 -1
- data/lib/generators/mdwa/user/templates/user.rb +12 -0
- data/lib/generators/mdwa/user/user_generator.rb +13 -104
- data/lib/generators/mdwa/{user → user_scaffold}/USAGE +1 -1
- data/lib/generators/mdwa/{user → user_scaffold}/templates/controllers/ajax_controller.rb +2 -1
- data/lib/generators/mdwa/{user → user_scaffold}/templates/controllers/controller.rb +2 -1
- data/lib/generators/mdwa/{user → user_scaffold}/templates/migrate.rb +2 -1
- data/lib/generators/mdwa/{user → user_scaffold}/templates/views/update.js.erb +0 -0
- data/lib/generators/mdwa/user_scaffold/user_scaffold_generator.rb +139 -0
- data/lib/mdd.rb +1 -1
- data/lib/mdwa.rb +1 -1
- data/lib/mdwa/all.rb +1 -1
- data/lib/mdwa/dsl.rb +17 -4
- data/lib/mdwa/dsl/action.rb +78 -0
- data/lib/mdwa/dsl/entities.rb +4 -4
- data/lib/mdwa/dsl/entity.rb +59 -23
- data/lib/mdwa/dsl/entity_actions.rb +73 -0
- data/lib/mdwa/dsl/entity_association.rb +1 -1
- data/lib/mdwa/dsl/entity_attribute.rb +1 -1
- data/lib/mdwa/dsl/entity_specification.rb +22 -0
- data/lib/mdwa/dsl/process.rb +53 -0
- data/lib/mdwa/dsl/process_detail.rb +57 -0
- data/lib/mdwa/dsl/process_detail_next_action.rb +16 -0
- data/lib/mdwa/dsl/requirement.rb +23 -0
- data/lib/mdwa/dsl/requirements.rb +57 -0
- data/lib/mdwa/dsl/user.rb +34 -0
- data/lib/mdwa/dsl/users.rb +57 -0
- data/lib/mdwa/dsl/workflow.rb +57 -0
- data/lib/mdwa/generators.rb +1 -1
- data/lib/mdwa/generators/model.rb +3 -1
- data/lib/mdwa/generators/model_association.rb +4 -1
- data/lib/mdwa/generators/model_attribute.rb +2 -1
- data/lib/mdwa/layout.rb +1 -1
- data/lib/mdwa/layout/base.rb +1 -1
- data/lib/mdwa/layout/helper.rb +1 -1
- data/lib/mdwa/version.rb +1 -1
- data/test/entity_actions_test.rb +101 -0
- data/test/entity_specifications_test.rb +37 -0
- data/test/entity_test.rb +1 -1
- data/test/layout_test.rb +1 -1
- data/test/process_test.rb +86 -0
- data/test/requirements_test.rb +44 -0
- data/test/users_test.rb +55 -0
- metadata +37 -10
- data/lib/mdwa/dsl/generator.rb +0 -10
- data/test/generators_test.rb +0 -0
data/lib/mdd.rb
CHANGED
data/lib/mdwa.rb
CHANGED
data/lib/mdwa/all.rb
CHANGED
data/lib/mdwa/dsl.rb
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
require 'mdwa/dsl/entities'
|
3
|
+
require 'mdwa/dsl/users'
|
4
|
+
require 'mdwa/dsl/requirements'
|
5
|
+
require 'mdwa/dsl/workflow'
|
6
|
+
|
3
7
|
module MDWA
|
4
8
|
module DSL
|
5
9
|
|
6
10
|
autoload :Entity, 'mdwa/dsl/entity'
|
7
11
|
autoload :EntityAttribute, 'mdwa/dsl/entity_attribute'
|
8
12
|
autoload :EntityAssociation, 'mdwa/dsl/entity_association'
|
9
|
-
autoload :
|
13
|
+
autoload :EntitySpecification, 'mdwa/dsl/entity_specification'
|
14
|
+
autoload :EntityActions, 'mdwa/dsl/entity_actions'
|
15
|
+
autoload :Action, 'mdwa/dsl/action'
|
16
|
+
autoload :User, 'mdwa/dsl/user'
|
17
|
+
autoload :Requirement, 'mdwa/dsl/requirement'
|
18
|
+
autoload :Process, 'mdwa/dsl/process'
|
19
|
+
autoload :ProcessDetail, 'mdwa/dsl/process_detail'
|
20
|
+
autoload :ProcessDetailNextAction, 'mdwa/dsl/process_detail_next_action'
|
10
21
|
|
11
|
-
STRUCTURAL_PATH
|
12
|
-
|
22
|
+
STRUCTURAL_PATH = 'app/mdwa/structure/'
|
23
|
+
USERS_PATH = 'app/mdwa/users/'
|
24
|
+
WORKFLOW_PATH = 'app/mdwa/workflow/'
|
25
|
+
REQUIREMENTS_PATH = 'app/mdwa/requirements/'
|
13
26
|
|
14
27
|
end
|
15
|
-
end
|
28
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MDWA
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
class Action
|
6
|
+
|
7
|
+
ACTION_TYPES = [:collection, :member]
|
8
|
+
ALLOWED_METHODS = [:get, :post, :put, :delete]
|
9
|
+
PREDEFINED_REQUEST_TYPES = [:html, :ajax, :ajax_js, :modalbox]
|
10
|
+
|
11
|
+
attr_accessor :name, :type, :method, :request_type, :response, :resource
|
12
|
+
|
13
|
+
def initialize(name, type, options)
|
14
|
+
self.name = name.to_sym
|
15
|
+
self.type = type.to_sym
|
16
|
+
self.method = options[:method] || :get
|
17
|
+
self.request_type = options[:request_type] || :html
|
18
|
+
self.response = options[:response] || {}
|
19
|
+
self.resource = options[:resource] || false
|
20
|
+
end
|
21
|
+
|
22
|
+
def request_type=(value)
|
23
|
+
if value.is_a? Array
|
24
|
+
@request_type = value
|
25
|
+
else
|
26
|
+
@request_type = [value]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def response=(value)
|
31
|
+
if value.is_a? Hash
|
32
|
+
@response = value
|
33
|
+
else
|
34
|
+
@response = {self.method.first.to_sym => value}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def member?
|
39
|
+
self.type.to_sym == :member
|
40
|
+
end
|
41
|
+
|
42
|
+
def collection?
|
43
|
+
self.type.to_sym == :collection
|
44
|
+
end
|
45
|
+
|
46
|
+
def resource?
|
47
|
+
resource
|
48
|
+
end
|
49
|
+
|
50
|
+
def generate_controller
|
51
|
+
action_str = []
|
52
|
+
action_str << "\tdef #{self.name.to_s}"
|
53
|
+
action_str << ""
|
54
|
+
action_str << "\t\trespond_to do |format|"
|
55
|
+
self.request_type.each do |request|
|
56
|
+
case request.to_sym
|
57
|
+
when :modalbox
|
58
|
+
# action_str << "\t\t\tformat.html{render :layout => false}"
|
59
|
+
when :html
|
60
|
+
action_str << "\t\t\tformat.html #{"{#{self.response[:html]}}" unless self.response[:html].blank?}"
|
61
|
+
when :ajax
|
62
|
+
action_str << "\t\t\tformat.js #{"{#{self.response[:ajax]}}" unless self.response[:ajax].blank?}"
|
63
|
+
when :ajax_js
|
64
|
+
action_str << "\t\t\tformat.json #{"{#{self.response[:ajax_js]}}" unless self.response[:ajax_js].blank?}"
|
65
|
+
else
|
66
|
+
action_str << "\t\t\tformat.#{request.to_s} #{"{#{self.response[request.to_sym]}}" unless self.response[request.to_sym].blank?}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
action_str << "\t\tend"
|
70
|
+
|
71
|
+
action_str << "\tend"
|
72
|
+
# action_str.join("\n")
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
data/lib/mdwa/dsl/entities.rb
CHANGED
@@ -20,9 +20,9 @@ module MDWA
|
|
20
20
|
#
|
21
21
|
def register( name )
|
22
22
|
# retrive or initialize a entity
|
23
|
-
|
24
|
-
yield
|
25
|
-
add_node
|
23
|
+
entity = element(name) || Entity.new( name )
|
24
|
+
yield(entity) if block_given?
|
25
|
+
add_node entity # add to the list
|
26
26
|
end
|
27
27
|
|
28
28
|
#
|
@@ -54,4 +54,4 @@ module MDWA
|
|
54
54
|
|
55
55
|
|
56
56
|
end # dsl
|
57
|
-
end # mdd
|
57
|
+
end # mdd
|
data/lib/mdwa/dsl/entity.rb
CHANGED
@@ -6,24 +6,25 @@ module MDWA
|
|
6
6
|
|
7
7
|
class Entity
|
8
8
|
|
9
|
-
attr_accessor :name, :resource, :user, :purpose, :scaffold_name, :model_name, :ajax, :
|
10
|
-
attr_accessor :attributes, :associations, :code_generations
|
9
|
+
attr_accessor :name, :resource, :user, :purpose, :scaffold_name, :model_name, :ajax, :force
|
10
|
+
attr_accessor :attributes, :associations, :actions, :specifications, :code_generations
|
11
11
|
|
12
12
|
def initialize( name )
|
13
13
|
# set the entity name
|
14
14
|
self.name = name
|
15
15
|
|
16
|
+
# arrays
|
17
|
+
self.attributes = {}
|
18
|
+
self.associations = {}
|
19
|
+
self.actions = EntityActions.new(self)
|
20
|
+
self.specifications = []
|
21
|
+
self.code_generations = []
|
22
|
+
|
16
23
|
# fixed attributes
|
17
24
|
self.resource = true
|
18
25
|
self.user = false
|
19
26
|
self.ajax = false
|
20
|
-
self.generated = false
|
21
27
|
self.force = false
|
22
|
-
|
23
|
-
# arrays
|
24
|
-
self.attributes = {}
|
25
|
-
self.associations = {}
|
26
|
-
self.code_generations = []
|
27
28
|
end
|
28
29
|
|
29
30
|
def name=(value)
|
@@ -31,11 +32,22 @@ module MDWA
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def scaffold_name
|
34
|
-
return (@scaffold_name.blank? ? name: @scaffold_name)
|
35
|
+
return (@scaffold_name.blank? ? name : @scaffold_name)
|
35
36
|
end
|
36
37
|
|
37
38
|
def model_name
|
38
|
-
return (@model_name.blank? ? scaffold_name: @model_name)
|
39
|
+
return (@model_name.blank? ? scaffold_name : @model_name)
|
40
|
+
end
|
41
|
+
|
42
|
+
def resource=(value)
|
43
|
+
@resource = value
|
44
|
+
|
45
|
+
# if entity is resorceful, generate default resource action
|
46
|
+
if resource?
|
47
|
+
self.actions.set_resource_actions
|
48
|
+
else
|
49
|
+
self.actions.clear_resource_actions
|
50
|
+
end
|
39
51
|
end
|
40
52
|
|
41
53
|
def resource?
|
@@ -60,17 +72,6 @@ module MDWA
|
|
60
72
|
self.attributes[attr.name] = attr
|
61
73
|
end
|
62
74
|
|
63
|
-
#
|
64
|
-
# Selects the default attribute of the entity
|
65
|
-
#
|
66
|
-
def default_attribute
|
67
|
-
default_attr = self.attributes.first.last # first element value
|
68
|
-
self.attributes.each do |key, attr|
|
69
|
-
default_attr = attr if attr.default?
|
70
|
-
end
|
71
|
-
return default_attr
|
72
|
-
end
|
73
|
-
|
74
75
|
#
|
75
76
|
# Defines one association
|
76
77
|
#
|
@@ -81,6 +82,30 @@ module MDWA
|
|
81
82
|
self.associations[assoc.name] = assoc
|
82
83
|
end
|
83
84
|
|
85
|
+
#
|
86
|
+
# Include a member action
|
87
|
+
# Params: name, method = get, request_type = html
|
88
|
+
def member_action(name, method = nil, request_type = nil)
|
89
|
+
self.actions.member_action(name, method, request_type)
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Include a collection action
|
94
|
+
# Params: name, method = get, request_type = html
|
95
|
+
def collection_action(name, method, request_type)
|
96
|
+
self.actions.collection_action(name, method, request_type)
|
97
|
+
end
|
98
|
+
|
99
|
+
#
|
100
|
+
# Entity specifications.
|
101
|
+
# Params: description and block
|
102
|
+
#
|
103
|
+
def specify(description)
|
104
|
+
specification = EntitySpecification.new(description)
|
105
|
+
yield(specification) if block_given?
|
106
|
+
self.specifications << specification
|
107
|
+
end
|
108
|
+
|
84
109
|
#
|
85
110
|
# Returns the associated model in app/models folder
|
86
111
|
#
|
@@ -95,6 +120,17 @@ module MDWA
|
|
95
120
|
self.name.singularize.underscore
|
96
121
|
end
|
97
122
|
|
123
|
+
#
|
124
|
+
# Selects the default attribute of the entity
|
125
|
+
#
|
126
|
+
def default_attribute
|
127
|
+
default_attr = self.attributes.first.last # first element value
|
128
|
+
self.attributes.each do |key, attr|
|
129
|
+
default_attr = attr if attr.default?
|
130
|
+
end
|
131
|
+
return default_attr
|
132
|
+
end
|
133
|
+
|
98
134
|
#
|
99
135
|
# Generate MDWA scaffold code for structural schema.
|
100
136
|
#
|
@@ -117,10 +153,10 @@ module MDWA
|
|
117
153
|
gen << "--force" if force
|
118
154
|
gen << "--model='#{model_name}'" if model_name != scaffold_name
|
119
155
|
|
120
|
-
"mdwa:#{user? ? '
|
156
|
+
"mdwa:#{user? ? 'user_scaffold': 'scaffold'} #{gen.join(' ')}"
|
121
157
|
end
|
122
158
|
|
123
159
|
end
|
124
160
|
|
125
161
|
end
|
126
|
-
end
|
162
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MDWA
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
class EntityActions
|
6
|
+
|
7
|
+
attr_accessor :entity, :actions
|
8
|
+
|
9
|
+
def initialize(entity)
|
10
|
+
self.entity = entity
|
11
|
+
self.actions = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def member_action(name, method, request_type)
|
15
|
+
self.actions[name.to_sym] = Action.new(name.to_sym, :member, :method => method, :request_type => request_type)
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# Include a collection action
|
20
|
+
# Params: name, method = get, request_type = html
|
21
|
+
def collection_action(name, method, request_type)
|
22
|
+
self.actions[name.to_sym] = Action.new(name.to_sym, :collection, :method => method, :request_type => request_type)
|
23
|
+
end
|
24
|
+
|
25
|
+
def member_actions
|
26
|
+
actions.values.to_a.select{|a| a.member? and !a.resource?}
|
27
|
+
end
|
28
|
+
|
29
|
+
def collection_actions
|
30
|
+
actions.values.to_a.select{|a| a.collection? and !a.resource?}
|
31
|
+
end
|
32
|
+
|
33
|
+
def generate_routes
|
34
|
+
routes = []
|
35
|
+
self.actions.values do |action|
|
36
|
+
routes << "#{action.method.to_s} '#{entity.name.underscore.pluralize}/#{action.name.to_s}' => #{action.name.to_sym}"
|
37
|
+
end
|
38
|
+
return routes
|
39
|
+
end
|
40
|
+
|
41
|
+
def generate_controller
|
42
|
+
controller = []
|
43
|
+
self.actions.value.select {|a| !a.resource?}.each do |action|
|
44
|
+
controller << action.generate_controller
|
45
|
+
end
|
46
|
+
# controller.join("\n\n")
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns all resource actions
|
50
|
+
def set_resource_actions
|
51
|
+
self.actions[:index] = Action.new(:index, :collection, :resource => true)
|
52
|
+
self.actions[:new] = Action.new(:new, :collection, :resource => true)
|
53
|
+
self.actions[:edit] = Action.new(:edit, :member, :resource => true)
|
54
|
+
self.actions[:show] = Action.new(:show, :member, :resource => true)
|
55
|
+
self.actions[:create] = Action.new(:create, :collection, :method => :post, :resource => true)
|
56
|
+
self.actions[:update] = Action.new(:update, :member, :method => :put, :resource => true)
|
57
|
+
self.actions[:delete] = Action.new(:delete, :member, :method => :delete, :resource => true)
|
58
|
+
end
|
59
|
+
|
60
|
+
def clear_resource_actions
|
61
|
+
self.actions.delete :index
|
62
|
+
self.actions.delete :new
|
63
|
+
self.actions.delete :edit
|
64
|
+
self.actions.delete :show
|
65
|
+
self.actions.delete :create
|
66
|
+
self.actions.delete :update
|
67
|
+
self.actions.delete :delete
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MDWA
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
class EntitySpecification
|
6
|
+
|
7
|
+
attr_accessor :description, :details
|
8
|
+
|
9
|
+
def initialize(description)
|
10
|
+
self.description = description
|
11
|
+
|
12
|
+
self.details = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def such_as(detail)
|
16
|
+
self.details << detail
|
17
|
+
end
|
18
|
+
|
19
|
+
end # class
|
20
|
+
|
21
|
+
end # dsl
|
22
|
+
end # mdwa
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module MDWA
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
class Process
|
6
|
+
attr_accessor :description, :alias, :details, :start_for_roles
|
7
|
+
|
8
|
+
def initialize(description)
|
9
|
+
self.description = description
|
10
|
+
|
11
|
+
# Hash: [detail_alias] => ProcessDetail object
|
12
|
+
self.details = {}
|
13
|
+
# Hash: [role_alias] => detail_alias
|
14
|
+
self.start_for_roles = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def alias
|
18
|
+
@alias ||= self.description.gsub(' ', '_').underscore
|
19
|
+
end
|
20
|
+
|
21
|
+
def start_for(role, detail_alias)
|
22
|
+
start_for_roles[role] = detail_alias
|
23
|
+
end
|
24
|
+
|
25
|
+
def detail(description)
|
26
|
+
detail = ProcessDetail.new(self, description)
|
27
|
+
self.details[detail.alias] = detail
|
28
|
+
yield(detail) if block_given?
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# Return the ProcessDetail based on alias, or entity and action.
|
33
|
+
# Params:
|
34
|
+
# :alias => detail alias
|
35
|
+
# :entity
|
36
|
+
# :action
|
37
|
+
def process_detail(options = {})
|
38
|
+
detail = self.details[options[:alias]] unless options[:alias].blank?
|
39
|
+
if detail.nil?
|
40
|
+
self.details.values.each do |d|
|
41
|
+
if( d.detail_action.entity == options[:entity] and d.detail_action.action == options[:action] )
|
42
|
+
detail = d
|
43
|
+
break
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
return detail
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end # dsl
|
53
|
+
end # mdwa
|