mdd 3.0.2 → 3.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/app/helpers/mdwa_helper.rb +2 -1
  2. data/lib/generators/mdwa/association/association_generator.rb +1 -1
  3. data/lib/generators/mdwa/association/templates/migrate/many_to_many.rb +1 -1
  4. data/lib/generators/mdwa/association/templates/migrate/one_field.rb +2 -1
  5. data/lib/generators/mdwa/code/code_generator.rb +54 -22
  6. data/lib/generators/mdwa/code/templates/migration.rb +2 -1
  7. data/lib/generators/mdwa/entity/entity_generator.rb +1 -2
  8. data/lib/generators/mdwa/entity/templates/entity.rb +2 -1
  9. data/lib/generators/mdwa/from_requirements/from_requirements_generator.rb +56 -0
  10. data/lib/generators/mdwa/process/USAGE +4 -0
  11. data/lib/generators/mdwa/process/process_generator.rb +24 -0
  12. data/lib/generators/mdwa/process/templates/process.rb +49 -0
  13. data/lib/generators/mdwa/requirement/USAGE +4 -0
  14. data/lib/generators/mdwa/requirement/requirement_generator.rb +24 -0
  15. data/lib/generators/mdwa/requirement/templates/requirement.rb +21 -0
  16. data/lib/generators/mdwa/sandbox/sandbox_generator.rb +1 -1
  17. data/lib/generators/mdwa/sandbox/templates/app/assets/stylesheets/mdwa/template/backend.css.erb +2 -2
  18. data/lib/generators/mdwa/sandbox/templates/app/controllers/a/backend_controller.rb +2 -1
  19. data/lib/generators/mdwa/sandbox/templates/app/controllers/a/users/sessions_controller.rb +1 -1
  20. data/lib/generators/mdwa/sandbox/templates/app/controllers/public_controller.rb +1 -0
  21. data/lib/generators/mdwa/sandbox/templates/config/initializers/devise.rb +1 -0
  22. data/lib/generators/mdwa/sandbox/templates/config/initializers/mdwa_layout.rb +2 -1
  23. data/lib/generators/mdwa/sandbox/templates/config/locales/mdwa.en.yml +1 -1
  24. data/lib/generators/mdwa/sandbox/templates/db/migrate/devise_create_users.rb +1 -1
  25. data/lib/generators/mdwa/sandbox/templates/db/seeds.rb +1 -1
  26. data/lib/generators/mdwa/sandbox/templates/db/seeds/site.rb +1 -1
  27. data/lib/generators/mdwa/scaffold/scaffold_generator.rb +10 -3
  28. data/lib/generators/mdwa/scaffold/templates/controllers/ajax_controller.rb +2 -1
  29. data/lib/generators/mdwa/scaffold/templates/controllers/controller.rb +2 -1
  30. data/lib/generators/mdwa/scaffold/templates/db_migrate/migrate.rb +2 -1
  31. data/lib/generators/mdwa/scaffold/templates/models/model.rb +2 -1
  32. data/lib/generators/mdwa/scaffold/templates/models/module.rb +2 -1
  33. data/lib/generators/mdwa/user/templates/user.rb +12 -0
  34. data/lib/generators/mdwa/user/user_generator.rb +13 -104
  35. data/lib/generators/mdwa/{user → user_scaffold}/USAGE +1 -1
  36. data/lib/generators/mdwa/{user → user_scaffold}/templates/controllers/ajax_controller.rb +2 -1
  37. data/lib/generators/mdwa/{user → user_scaffold}/templates/controllers/controller.rb +2 -1
  38. data/lib/generators/mdwa/{user → user_scaffold}/templates/migrate.rb +2 -1
  39. data/lib/generators/mdwa/{user → user_scaffold}/templates/views/update.js.erb +0 -0
  40. data/lib/generators/mdwa/user_scaffold/user_scaffold_generator.rb +139 -0
  41. data/lib/mdd.rb +1 -1
  42. data/lib/mdwa.rb +1 -1
  43. data/lib/mdwa/all.rb +1 -1
  44. data/lib/mdwa/dsl.rb +17 -4
  45. data/lib/mdwa/dsl/action.rb +78 -0
  46. data/lib/mdwa/dsl/entities.rb +4 -4
  47. data/lib/mdwa/dsl/entity.rb +59 -23
  48. data/lib/mdwa/dsl/entity_actions.rb +73 -0
  49. data/lib/mdwa/dsl/entity_association.rb +1 -1
  50. data/lib/mdwa/dsl/entity_attribute.rb +1 -1
  51. data/lib/mdwa/dsl/entity_specification.rb +22 -0
  52. data/lib/mdwa/dsl/process.rb +53 -0
  53. data/lib/mdwa/dsl/process_detail.rb +57 -0
  54. data/lib/mdwa/dsl/process_detail_next_action.rb +16 -0
  55. data/lib/mdwa/dsl/requirement.rb +23 -0
  56. data/lib/mdwa/dsl/requirements.rb +57 -0
  57. data/lib/mdwa/dsl/user.rb +34 -0
  58. data/lib/mdwa/dsl/users.rb +57 -0
  59. data/lib/mdwa/dsl/workflow.rb +57 -0
  60. data/lib/mdwa/generators.rb +1 -1
  61. data/lib/mdwa/generators/model.rb +3 -1
  62. data/lib/mdwa/generators/model_association.rb +4 -1
  63. data/lib/mdwa/generators/model_attribute.rb +2 -1
  64. data/lib/mdwa/layout.rb +1 -1
  65. data/lib/mdwa/layout/base.rb +1 -1
  66. data/lib/mdwa/layout/helper.rb +1 -1
  67. data/lib/mdwa/version.rb +1 -1
  68. data/test/entity_actions_test.rb +101 -0
  69. data/test/entity_specifications_test.rb +37 -0
  70. data/test/entity_test.rb +1 -1
  71. data/test/layout_test.rb +1 -1
  72. data/test/process_test.rb +86 -0
  73. data/test/requirements_test.rb +44 -0
  74. data/test/users_test.rb +55 -0
  75. metadata +37 -10
  76. data/lib/mdwa/dsl/generator.rb +0 -10
  77. data/test/generators_test.rb +0 -0
data/lib/mdd.rb CHANGED
@@ -5,4 +5,4 @@ module MDD
5
5
  class MDD < Rails::Engine
6
6
  config.autoload_paths << File.expand_path("../app", __FILE__)
7
7
  end
8
- end
8
+ end
data/lib/mdwa.rb CHANGED
@@ -3,4 +3,4 @@ require "mdwa/version"
3
3
 
4
4
  module MDWA
5
5
 
6
- end
6
+ end
data/lib/mdwa/all.rb CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
  require 'mdwa/dsl'
4
4
  require 'mdwa/generators'
5
- require 'mdwa/layout'
5
+ require 'mdwa/layout'
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 :Generator, 'mdwa/dsl/generator'
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 = 'app/mdwa/structure/'
12
- NAVIGATION_PATH = 'app/mdwa/navigation/'
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
@@ -20,9 +20,9 @@ module MDWA
20
20
  #
21
21
  def register( name )
22
22
  # retrive or initialize a entity
23
- e = element(name) || Entity.new( name )
24
- yield e
25
- add_node e # add to the list
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
@@ -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, :generated, :force
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? ? 'user': 'scaffold'} #{gen.join(' ')}"
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
@@ -56,4 +56,4 @@ module MDWA
56
56
  end
57
57
 
58
58
  end
59
- end
59
+ end
@@ -43,4 +43,4 @@ module MDWA
43
43
  end
44
44
 
45
45
  end
46
- end
46
+ 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