mdd 3.0.2 → 3.0.3

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.
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