stonepath 0.4.3 → 0.5.0

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 (48) hide show
  1. data/README.rdoc +2 -4
  2. data/Rakefile +3 -4
  3. data/VERSION +1 -1
  4. data/lib/generators/stonepath.rb +11 -0
  5. data/lib/generators/stonepath/event_log/event_log_generator.rb +34 -0
  6. data/{rails_generators/stonepath_event_log → lib/generators/stonepath/event_log}/templates/create_event_records.rb +0 -0
  7. data/{rails_generators/stonepath_event_log → lib/generators/stonepath/event_log}/templates/event_record.rb +0 -0
  8. data/lib/generators/stonepath/events_scaffold/events_scaffold_generator.rb +13 -0
  9. data/{rails_generators/stonepath_task → lib/generators/stonepath/task}/USAGE +0 -0
  10. data/lib/generators/stonepath/task/task_generator.rb +39 -0
  11. data/{rails_generators/stonepath_task/templates/generic_task_migration.rb → lib/generators/stonepath/task/templates/migration.rb} +4 -4
  12. data/{rails_generators/stonepath_task/templates/generic_task.rb → lib/generators/stonepath/task/templates/task.rb} +2 -2
  13. data/{rails_generators/stonepath_workitem → lib/generators/stonepath/workitem_model}/templates/migration.rb +4 -4
  14. data/lib/generators/stonepath/workitem_model/templates/model.rb +35 -0
  15. data/lib/generators/stonepath/workitem_model/workitem_model_generator.rb +36 -0
  16. data/{rails_generators/stonepath_workitem → lib/generators/stonepath/workitem_scaffold}/templates/model.rb +0 -0
  17. data/lib/generators/stonepath/workitem_scaffold/workitem_scaffold_generator.rb +13 -0
  18. data/lib/stonepath/work_item.rb +1 -3
  19. metadata +30 -52
  20. data/rails_generators/stonepath_event_log/stonepath_event_log_generator.rb +0 -9
  21. data/rails_generators/stonepath_task/stonepath_task_generator.rb +0 -29
  22. data/rails_generators/stonepath_workitem/USAGE +0 -51
  23. data/rails_generators/stonepath_workitem/stonepath_workitem_generator.rb +0 -196
  24. data/rails_generators/stonepath_workitem/templates/actions/create.rb +0 -9
  25. data/rails_generators/stonepath_workitem/templates/actions/destroy.rb +0 -6
  26. data/rails_generators/stonepath_workitem/templates/actions/edit.rb +0 -3
  27. data/rails_generators/stonepath_workitem/templates/actions/index.rb +0 -3
  28. data/rails_generators/stonepath_workitem/templates/actions/new.rb +0 -3
  29. data/rails_generators/stonepath_workitem/templates/actions/show.rb +0 -3
  30. data/rails_generators/stonepath_workitem/templates/actions/update.rb +0 -9
  31. data/rails_generators/stonepath_workitem/templates/controller.rb +0 -3
  32. data/rails_generators/stonepath_workitem/templates/event_controller.rb +0 -25
  33. data/rails_generators/stonepath_workitem/templates/fixtures.yml +0 -9
  34. data/rails_generators/stonepath_workitem/templates/helper.rb +0 -2
  35. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/create.rb +0 -11
  36. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/destroy.rb +0 -6
  37. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/edit.rb +0 -4
  38. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/index.rb +0 -4
  39. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/new.rb +0 -4
  40. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/show.rb +0 -4
  41. data/rails_generators/stonepath_workitem/templates/tests/testunit/actions/update.rb +0 -11
  42. data/rails_generators/stonepath_workitem/templates/tests/testunit/controller.rb +0 -5
  43. data/rails_generators/stonepath_workitem/templates/tests/testunit/model.rb +0 -7
  44. data/rails_generators/stonepath_workitem/templates/views/erb/_form.html.erb +0 -10
  45. data/rails_generators/stonepath_workitem/templates/views/erb/edit.html.erb +0 -12
  46. data/rails_generators/stonepath_workitem/templates/views/erb/index.html.erb +0 -27
  47. data/rails_generators/stonepath_workitem/templates/views/erb/new.html.erb +0 -5
  48. data/rails_generators/stonepath_workitem/templates/views/erb/show.html.erb +0 -26
@@ -2,13 +2,11 @@
2
2
 
3
3
  State-based workflow for rails.
4
4
 
5
- UPDATE: The StonePath acl is being pulled out into a separate project called StoneWall.
6
- Update #2: Rather than reinvent a common wheel, StonePath now relies on the sentient_user gem.
5
+ As of verion 0.5.0, this supports Rails3. The only piece that needed to be upgrded was the generators, and with the new capabilities in rails3 generators, there will be a few new ones soon.
7
6
 
8
- For more information, check out the stonepath.pdf in this same directory. Stonepath is in real use and under active development, so improved docs will be arriving in this location shortly.
7
+ The testing harness in this app is a Rails 2.3.8 app. Upgrading these tests is going to be painful, but will happen over the next few weeks.
9
8
 
10
9
 
11
- gem install stonepath
12
10
 
13
11
  == LICENSE:
14
12
 
data/Rakefile CHANGED
@@ -13,10 +13,9 @@ begin
13
13
  gemspec.homepage = "http://github.com/bokmann/stonepath"
14
14
  gemspec.description = "Stateful workflow modeling for Rails"
15
15
  gemspec.authors = ["David Bock"]
16
- gemspec.add_dependency('activerecord','>= 2.0.0')
17
- gemspec.add_dependency('aasm','>= 2.1.3')
18
- gemspec.add_dependency('sentient_user','>= 0.1.0')
19
-
16
+ gemspec.add_dependency('activerecord','>= 3.0.0')
17
+ gemspec.add_dependency('aasm','>= 2.2.0')
18
+ gemspec.add_dependency('sentient_user','>= 0.3.2')
20
19
  end
21
20
 
22
21
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.3
1
+ 0.5.0
@@ -0,0 +1,11 @@
1
+ require 'rails/generators/named_base'
2
+
3
+ module Stonepath
4
+ module Generators
5
+ class Base < Rails::Generators::NamedBase
6
+ def self.source_root
7
+ @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'stonepath', generator_name, 'templates'))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,34 @@
1
+ require 'generators/stonepath'
2
+
3
+ module Stonepath
4
+ module Generators
5
+ class EventLogGenerator < Rails::Generators::Base
6
+ include Rails::Generators::Migration
7
+
8
+ def self.source_root
9
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
10
+ end
11
+
12
+ def create_model_file
13
+ template('event_record.rb', "app/models/event_record.rb")
14
+ end
15
+
16
+ def create_migration
17
+ migration_template 'create_event_records.rb', "db/migrate/create_event_records.rb"
18
+ end
19
+
20
+ protected
21
+
22
+ # Implement the required interface for Rails::Generators::Migration.
23
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
24
+ def self.next_migration_number(dirname)
25
+ if ActiveRecord::Base.timestamped_migrations
26
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
27
+ else
28
+ "%.3d" % (current_migration_number(dirname) + 1)
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ require 'generators/stonepath'
2
+
3
+ module Stonepath
4
+ module Generators
5
+ class EventsScaffoldGenerator < Rails::Generators::Base
6
+
7
+ def generate
8
+ puts "not yet implemented"
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,39 @@
1
+ require 'generators/stonepath'
2
+
3
+ # it disgusts me how we generate the migration here. I would expect a better way in rails3.
4
+ #until I finf it, this technique is lifted from this blog entry
5
+ # http://www.themodestrubyist.com/2010/03/16/rails-3-plugins---part-3---rake-tasks-generators-initializers-oh-my/
6
+ module Stonepath
7
+ module Generators
8
+ class TaskGenerator < Base
9
+ include Rails::Generators::Migration
10
+
11
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
12
+
13
+ def create_model_file
14
+ template('task.rb', "app/models/#{file_name}.rb") if valid_model_name?(file_name)
15
+ end
16
+
17
+ def create_migration
18
+ migration_template 'migration.rb', "db/migrate/create_#{file_name.pluralize}.rb"
19
+ end
20
+
21
+ protected
22
+
23
+ def valid_model_name?(name)
24
+ (name =~ /("|'|:|;|\||&|<|>)/).nil?
25
+ end
26
+
27
+ # Implement the required interface for Rails::Generators::Migration.
28
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
29
+ def self.next_migration_number(dirname)
30
+ if ActiveRecord::Base.timestamped_migrations
31
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
32
+ else
33
+ "%.3d" % (current_migration_number(dirname) + 1)
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
- class Create<%= args[0].tableize.classify.pluralize %> < ActiveRecord::Migration
1
+ class Create<%= file_name.tableize.classify.pluralize %> < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :<%= args[0].tableize %> do |t|
3
+ create_table :<%= file_name.tableize %> do |t|
4
4
 
5
5
  # don't change these unless you want to get deep into meta in the
6
6
  # stonepath gem.
@@ -13,7 +13,7 @@ class Create<%= args[0].tableize.classify.pluralize %> < ActiveRecord::Migration
13
13
  t.timestamps
14
14
 
15
15
  # This "urgent at' concept was useful in one of the domains StonePath
16
- # was written/extracted from. The idea is thatm while something is 'due'
16
+ # was written/extracted from. The idea is that while something is 'due'
17
17
  # at a specific time, it might become urgent shortly before it is due.
18
18
  # In that domain, we color-coded tasks as green (due date is far out)
19
19
  # yellow (urgent timestap has passed), and red (overdue - due date
@@ -31,6 +31,6 @@ class Create<%= args[0].tableize.classify.pluralize %> < ActiveRecord::Migration
31
31
  end
32
32
 
33
33
  def self.down
34
- drop_table :<%= args[0].tableize %>
34
+ drop_table :<%= file_name.tableize %>
35
35
  end
36
36
  end
@@ -1,9 +1,9 @@
1
- class <%= args[0].classify %> < ActiveRecord::Base
1
+ class <%= class_name %> < ActiveRecord::Base
2
2
  include StonePath
3
3
 
4
4
  stonepath_task
5
5
 
6
- #logs_transitions # uncomment this if you generate the event log.
6
+ #log_events # uncomment this if you generate the event log.
7
7
 
8
8
  attr_accessible :workitem, :workbench, <%= attributes.map { |a| ":#{a.name}" }.join(", ") %>
9
9
 
@@ -1,6 +1,6 @@
1
- class Create<%= plural_class_name %> < ActiveRecord::Migration
1
+ class Create<%= file_name.tableize.classify.pluralize %> < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :<%= plural_name %> do |t|
3
+ create_table :<%= file_name.tableize %> do |t|
4
4
  # These are the attributes of a workitem
5
5
  t.string :aasm_state
6
6
  t.integer :owner_id
@@ -19,6 +19,6 @@ class Create<%= plural_class_name %> < ActiveRecord::Migration
19
19
  end
20
20
 
21
21
  def self.down
22
- drop_table :<%= plural_name %>
22
+ drop_table :<%= file_name.tableize %>
23
23
  end
24
- end
24
+ end
@@ -0,0 +1,35 @@
1
+ class <%= class_name %> < ActiveRecord::Base
2
+ include StonePath
3
+
4
+ stonepath_workitem do
5
+ #owned_by :your_owning class
6
+
7
+ #tasked_through :your_implementation_of_stonepath_task
8
+
9
+ #log_events # uncomment this if you generate the event log.
10
+
11
+ # This is an example trivial workflow. This is now yours to change as
12
+ # you see fit.
13
+ aasm_initial_state :pending
14
+
15
+ aasm_state :pending
16
+ aasm_state :in_process
17
+ aasm_state :completed
18
+
19
+ aasm_event :activate do
20
+ transitions :to => :in_process, :from => :pending
21
+ end
22
+
23
+ aasm_event :complete do
24
+ transitions :to => :completed, :from => :in_process
25
+ end
26
+
27
+ aasm_event :reactivate do
28
+ transitions :to => :in_process, :from => :completed
29
+ end
30
+
31
+ end
32
+
33
+ attr_accessible <%= attributes.map { |a| ":#{a.name}" }.join(", ") %>
34
+
35
+ end
@@ -0,0 +1,36 @@
1
+ require 'generators/stonepath'
2
+
3
+ module Stonepath
4
+ module Generators
5
+ class WorkitemModelGenerator < Base
6
+ include Rails::Generators::Migration
7
+
8
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
9
+
10
+ def create_model_file
11
+ template('model.rb', "app/models/#{file_name}.rb") if valid_model_name?(file_name)
12
+ end
13
+
14
+ def create_migration
15
+ migration_template 'migration.rb', "db/migrate/create_#{file_name.pluralize}.rb"
16
+ end
17
+
18
+ protected
19
+
20
+ def valid_model_name?(name)
21
+ (name =~ /("|'|:|;|\||&|<|>)/).nil?
22
+ end
23
+
24
+ # Implement the required interface for Rails::Generators::Migration.
25
+ # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
26
+ def self.next_migration_number(dirname)
27
+ if ActiveRecord::Base.timestamped_migrations
28
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
29
+ else
30
+ "%.3d" % (current_migration_number(dirname) + 1)
31
+ end
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ require 'generators/stonepath'
2
+
3
+ module Stonepath
4
+ module Generators
5
+ class WorkitemScaffoldGenerator < Base
6
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
7
+
8
+ def generate
9
+ puts "not yet implemented"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -41,9 +41,7 @@ module StonePath
41
41
  end
42
42
 
43
43
  base.instance_eval do
44
- unless method_defined? :to_xml_without_events
45
- alias_method_chain :to_xml, :events
46
- end
44
+ alias_method_chain :to_xml, :events
47
45
  end
48
46
 
49
47
  end #self.included
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stonepath
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 4
9
- - 3
10
- version: 0.4.3
8
+ - 5
9
+ - 0
10
+ version: 0.5.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - David Bock
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-30 00:00:00 -05:00
18
+ date: 2011-01-24 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -26,12 +26,12 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- hash: 15
29
+ hash: 7
30
30
  segments:
31
- - 2
31
+ - 3
32
32
  - 0
33
33
  - 0
34
- version: 2.0.0
34
+ version: 3.0.0
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -42,12 +42,12 @@ dependencies:
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- hash: 13
45
+ hash: 7
46
46
  segments:
47
47
  - 2
48
- - 1
49
- - 3
50
- version: 2.1.3
48
+ - 2
49
+ - 0
50
+ version: 2.2.0
51
51
  type: :runtime
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
@@ -58,12 +58,12 @@ dependencies:
58
58
  requirements:
59
59
  - - ">="
60
60
  - !ruby/object:Gem::Version
61
- hash: 27
61
+ hash: 23
62
62
  segments:
63
63
  - 0
64
- - 1
65
- - 0
66
- version: 0.1.0
64
+ - 3
65
+ - 2
66
+ version: 0.3.2
67
67
  type: :runtime
68
68
  version_requirements: *id003
69
69
  description: Stateful workflow modeling for Rails
@@ -81,6 +81,20 @@ files:
81
81
  - README.rdoc
82
82
  - Rakefile
83
83
  - VERSION
84
+ - lib/generators/stonepath.rb
85
+ - lib/generators/stonepath/event_log/event_log_generator.rb
86
+ - lib/generators/stonepath/event_log/templates/create_event_records.rb
87
+ - lib/generators/stonepath/event_log/templates/event_record.rb
88
+ - lib/generators/stonepath/events_scaffold/events_scaffold_generator.rb
89
+ - lib/generators/stonepath/task/USAGE
90
+ - lib/generators/stonepath/task/task_generator.rb
91
+ - lib/generators/stonepath/task/templates/migration.rb
92
+ - lib/generators/stonepath/task/templates/task.rb
93
+ - lib/generators/stonepath/workitem_model/templates/migration.rb
94
+ - lib/generators/stonepath/workitem_model/templates/model.rb
95
+ - lib/generators/stonepath/workitem_model/workitem_model_generator.rb
96
+ - lib/generators/stonepath/workitem_scaffold/templates/model.rb
97
+ - lib/generators/stonepath/workitem_scaffold/workitem_scaffold_generator.rb
84
98
  - lib/stonepath.rb
85
99
  - lib/stonepath/config.rb
86
100
  - lib/stonepath/dot.rb
@@ -93,42 +107,6 @@ files:
93
107
  - lib/stonepath/work_owner.rb
94
108
  - lib/tasks/stonepath.rake
95
109
  - rails/init.rb
96
- - rails_generators/stonepath_event_log/stonepath_event_log_generator.rb
97
- - rails_generators/stonepath_event_log/templates/create_event_records.rb
98
- - rails_generators/stonepath_event_log/templates/event_record.rb
99
- - rails_generators/stonepath_task/USAGE
100
- - rails_generators/stonepath_task/stonepath_task_generator.rb
101
- - rails_generators/stonepath_task/templates/generic_task.rb
102
- - rails_generators/stonepath_task/templates/generic_task_migration.rb
103
- - rails_generators/stonepath_workitem/USAGE
104
- - rails_generators/stonepath_workitem/stonepath_workitem_generator.rb
105
- - rails_generators/stonepath_workitem/templates/actions/create.rb
106
- - rails_generators/stonepath_workitem/templates/actions/destroy.rb
107
- - rails_generators/stonepath_workitem/templates/actions/edit.rb
108
- - rails_generators/stonepath_workitem/templates/actions/index.rb
109
- - rails_generators/stonepath_workitem/templates/actions/new.rb
110
- - rails_generators/stonepath_workitem/templates/actions/show.rb
111
- - rails_generators/stonepath_workitem/templates/actions/update.rb
112
- - rails_generators/stonepath_workitem/templates/controller.rb
113
- - rails_generators/stonepath_workitem/templates/event_controller.rb
114
- - rails_generators/stonepath_workitem/templates/fixtures.yml
115
- - rails_generators/stonepath_workitem/templates/helper.rb
116
- - rails_generators/stonepath_workitem/templates/migration.rb
117
- - rails_generators/stonepath_workitem/templates/model.rb
118
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/create.rb
119
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/destroy.rb
120
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/edit.rb
121
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/index.rb
122
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/new.rb
123
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/show.rb
124
- - rails_generators/stonepath_workitem/templates/tests/testunit/actions/update.rb
125
- - rails_generators/stonepath_workitem/templates/tests/testunit/controller.rb
126
- - rails_generators/stonepath_workitem/templates/tests/testunit/model.rb
127
- - rails_generators/stonepath_workitem/templates/views/erb/_form.html.erb
128
- - rails_generators/stonepath_workitem/templates/views/erb/edit.html.erb
129
- - rails_generators/stonepath_workitem/templates/views/erb/index.html.erb
130
- - rails_generators/stonepath_workitem/templates/views/erb/new.html.erb
131
- - rails_generators/stonepath_workitem/templates/views/erb/show.html.erb
132
110
  - script/console
133
111
  - script/destroy
134
112
  - script/generate
@@ -1,9 +0,0 @@
1
- class StonepathEventLogGenerator < Rails::Generator::Base
2
- def manifest
3
- record do |m|
4
- task_name = args[0]
5
- m.template('event_record.rb', "app/models/event_record.rb")
6
- m.migration_template("create_event_records.rb", "db/migrate", :migration_file_name => "create_event_records")
7
- end
8
- end
9
- end
@@ -1,29 +0,0 @@
1
- class StonepathTaskGenerator < Rails::Generator::Base
2
-
3
-
4
- attr_accessor :name, :attributes
5
-
6
- def initialize(runtime_args, runtime_options = {})
7
- super
8
- usage if @args.empty?
9
-
10
- @name = @args.first
11
- @controller_actions = []
12
- @attributes = []
13
-
14
- @args[1..-1].each do |arg|
15
- if arg.include? ':'
16
- @attributes << Rails::Generator::GeneratedAttribute.new(*arg.split(":"))
17
- end
18
- end
19
-
20
- @attributes.uniq!
21
- end
22
-
23
- def manifest
24
- record do |m|
25
- m.template('generic_task.rb', "app/models/#{@name.tableize.singularize}.rb")
26
- m.migration_template("generic_task_migration.rb", "db/migrate", :migration_file_name => "create_#{@name.tableize}")
27
- end
28
- end
29
- end
@@ -1,51 +0,0 @@
1
- Description:
2
- Scaffolds an entire resource, from model and migration to controller and
3
- views. The resource is ready to use as a starting point for your restful,
4
- resource-oriented application. Tests or specs are also generated depending
5
- on if you have a "spec" directory or not.
6
-
7
- IMPORTANT: This generator uses the "title" helper method which is generated
8
- by the nifty_layout generator. You may want to run that generator first.
9
-
10
- Usage:
11
- Pass the name of the model, either CamelCased or under_scored, as the first
12
- argument, and an optional list of attribute pairs and controller actions.
13
-
14
- If no controller actions are specified, they will default to index, show,
15
- new, create, edit, update, and destroy.
16
-
17
- IMPORTANT: If no attribute pairs are specified, no model will be generated.
18
- It will try to determine the attributes from an existing model.
19
-
20
- Attribute pairs are column_name:sql_type arguments specifying the
21
- model's attributes. Timestamps are added by default, so you don't have to
22
- specify them by hand as 'created_at:datetime updated_at:datetime'.
23
-
24
- For example, `nifty_scaffold post name:string content:text hidden:boolean`
25
- gives you a model with those three attributes, a controller that handles
26
- the create/show/update/destroy, forms to create and edit your posts, and
27
- an index that lists them all, as well as a map.resources :posts
28
- declaration in config/routes.rb.
29
-
30
- Adding an "!" in the mix of arguments will invert the passed controller
31
- actions. This will include all 7 controller actitons except the ones
32
- mentioned. This option doesn't effect model attributes.
33
-
34
- Examples:
35
- script/generate nifty_scaffold post
36
-
37
- Will create a controller called "posts" it will contain all seven
38
- CRUD actions along with the views. A model will NOT be created,
39
- instead it will look for an existing model and use those attributes.
40
-
41
- script/generate nifty_scaffold post name:string content:text index new edit
42
-
43
- Will create a Post model and migration file with the name and content
44
- attributes. It will also create a controller with index, new, create,
45
- edit, and update actions. Notice the create and update actions are
46
- added automatically with new and edit.
47
-
48
- script/generate nifty_scaffold post ! show new
49
-
50
- Creates a posts controller (no model) with index, edit, update, and
51
- destroy actions.
@@ -1,196 +0,0 @@
1
- class StonepathWorkitemGenerator < Rails::Generator::Base
2
-
3
- load File.expand_path( File.dirname(__FILE__)) + '/../../lib/stonepath/extensions/rails_generator_commands.rb'
4
-
5
- attr_accessor :name, :attributes
6
-
7
- def initialize(runtime_args, runtime_options = {})
8
- super
9
- usage if @args.empty?
10
-
11
- @name = @args.first
12
- @attributes = []
13
- @args[1..-1].each do |arg|
14
- if arg.include? ':'
15
- @attributes << Rails::Generator::GeneratedAttribute.new(*arg.split(":"))
16
- end
17
- end
18
- @attributes.uniq!
19
- @controller_actions = all_actions
20
- end
21
-
22
- def manifest
23
- record do |m|
24
-
25
- m.directory "app/models"
26
- m.template "model.rb", "app/models/#{singular_name}.rb"
27
- m.migration_template "migration.rb", "db/migrate", :migration_file_name => "create_#{plural_name}"
28
- m.directory "test/unit"
29
- m.template "tests/#{test_framework}/model.rb", "test/unit/#{singular_name}_test.rb"
30
- m.directory "test/fixtures"
31
- m.template "fixtures.yml", "test/fixtures/#{plural_name}.yml"
32
-
33
- m.directory "app/controllers"
34
- m.template "controller.rb", "app/controllers/#{plural_name}_controller.rb"
35
- m.template "event_controller.rb", "app/controllers/#{singular_name}_events_controller.rb"
36
-
37
- m.directory "app/helpers"
38
- m.template "helper.rb", "app/helpers/#{plural_name}_helper.rb"
39
-
40
- m.directory "app/views/#{plural_name}"
41
- @controller_actions.each do |action|
42
- if File.exist? source_path("views/#{view_language}/#{action}.html.#{view_language}")
43
- m.template "views/#{view_language}/#{action}.html.#{view_language}", "app/views/#{plural_name}/#{action}.html.#{view_language}"
44
- end
45
- end
46
-
47
- if form_partial?
48
- m.template "views/#{view_language}/_form.html.#{view_language}", "app/views/#{plural_name}/_form.html.#{view_language}"
49
- end
50
-
51
- m.route_stonepath_workitems plural_name
52
-
53
- m.directory "test/functional"
54
- m.template "tests/#{test_framework}/controller.rb", "test/functional/#{plural_name}_controller_test.rb"
55
- end
56
- end
57
-
58
- def form_partial?
59
- actions? :new, :edit
60
- end
61
-
62
- def all_actions
63
- %w[index show new create edit update destroy]
64
- end
65
-
66
- def action?(name)
67
- @controller_actions.include? name.to_s
68
- end
69
-
70
- def actions?(*names)
71
- names.all? { |n| action? n.to_s }
72
- end
73
-
74
- def singular_name
75
- name.underscore
76
- end
77
-
78
- def plural_name
79
- name.underscore.pluralize
80
- end
81
-
82
- def class_name
83
- name.camelize
84
- end
85
-
86
- def object_id_name
87
- (class_name.tableize.singularize + "_id")
88
- end
89
-
90
- def plural_class_name
91
- plural_name.camelize
92
- end
93
-
94
- def controller_methods(dir_name)
95
- @controller_actions.map do |action|
96
- read_template("#{dir_name}/#{action}.rb")
97
- end.join(" \n").strip
98
- end
99
-
100
- def render_form
101
- if form_partial?
102
- if options[:haml]
103
- "= render :partial => 'form'"
104
- else
105
- "<%= render :partial => 'form' %>"
106
- end
107
- else
108
- read_template("views/#{view_language}/_form.html.#{view_language}")
109
- end
110
- end
111
-
112
- def items_path(suffix = 'path')
113
- if action? :index
114
- "#{plural_name}_#{suffix}"
115
- else
116
- "root_#{suffix}"
117
- end
118
- end
119
-
120
- def item_path(suffix = 'path')
121
- if action? :show
122
- "@#{singular_name}"
123
- else
124
- items_path(suffix)
125
- end
126
- end
127
-
128
- def item_path_for_spec(suffix = 'path')
129
- if action? :show
130
- "#{singular_name}_#{suffix}(assigns[:#{singular_name}])"
131
- else
132
- items_path(suffix)
133
- end
134
- end
135
-
136
- def item_path_for_test(suffix = 'path')
137
- if action? :show
138
- "#{singular_name}_#{suffix}(assigns(:#{singular_name}))"
139
- else
140
- items_path(suffix)
141
- end
142
- end
143
-
144
- def model_columns_for_attributes
145
- class_name.constantize.columns.reject do |column|
146
- column.name.to_s =~ /^(id|created_at|updated_at)$/
147
- end
148
- end
149
-
150
- def rspec?
151
- test_framework == :rspec
152
- end
153
-
154
- protected
155
-
156
- def view_language
157
- options[:haml] ? 'haml' : 'erb'
158
- end
159
-
160
- def test_framework
161
- options[:test_framework] ||= default_test_framework
162
- end
163
-
164
- def default_test_framework
165
- File.exist?(destination_path("spec")) ? :rspec : :testunit
166
- end
167
-
168
- def add_options!(opt)
169
- opt.separator ''
170
- opt.separator 'Options:'
171
- # opt.on("--skip-model", "Don't generate a model or migration file.") { |v| options[:skip_model] = v }
172
- # opt.on("--skip-migration", "Don't generate migration file for model.") { |v| options[:skip_migration] = v }
173
- # opt.on("--skip-timestamps", "Don't add timestamps to migration file.") { |v| options[:skip_timestamps] = v }
174
- # opt.on("--skip-controller", "Don't generate controller, helper, or views.") { |v| options[:skip_controller] = v }
175
- # opt.on("--invert", "Generate all controller actions except these mentioned.") { |v| options[:invert] = v }
176
- # opt.on("--haml", "Generate HAML views instead of ERB.") { |v| options[:haml] = v }
177
- # opt.on("--testunit", "Use test/unit for test files.") { options[:test_framework] = :testunit }
178
- # opt.on("--rspec", "Use RSpec for test files.") { options[:test_framework] = :rspec }
179
- # opt.on("--shoulda", "Use Shoulda for test files.") { options[:test_framework] = :shoulda }
180
- end
181
-
182
- # is there a better way to do this? Perhaps with const_defined?
183
- def model_exists?
184
- File.exist? destination_path("app/models/#{singular_name}.rb")
185
- end
186
-
187
- def read_template(relative_path)
188
- ERB.new(File.read(source_path(relative_path)), nil, '-').result(binding)
189
- end
190
-
191
- def banner
192
- <<-EOS
193
- Creates a WorkItem as defined by the Stonepath Workflow Methodology
194
- EOS
195
- end
196
- end
@@ -1,9 +0,0 @@
1
- def create
2
- @<%= singular_name %> = <%= class_name %>.new(params[:<%= singular_name %>])
3
- if @<%= singular_name %>.save
4
- flash[:notice] = "Successfully created <%= name.underscore.humanize.downcase %>."
5
- redirect_to <%= item_path('url') %>
6
- else
7
- render :action => 'new'
8
- end
9
- end
@@ -1,6 +0,0 @@
1
- def destroy
2
- @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
- @<%= singular_name %>.destroy
4
- flash[:notice] = "Successfully destroyed <%= name.underscore.humanize.downcase %>."
5
- redirect_to <%= items_path('url') %>
6
- end
@@ -1,3 +0,0 @@
1
- def edit
2
- @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
- end
@@ -1,3 +0,0 @@
1
- def index
2
- @<%= plural_name %> = <%= class_name %>.all
3
- end
@@ -1,3 +0,0 @@
1
- def new
2
- @<%= singular_name %> = <%= class_name %>.new
3
- end
@@ -1,3 +0,0 @@
1
- def show
2
- @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
- end
@@ -1,9 +0,0 @@
1
- def update
2
- @<%= singular_name %> = <%= class_name %>.find(params[:id])
3
- if @<%= singular_name %>.update_attributes(params[:<%= singular_name %>])
4
- flash[:notice] = "Successfully updated <%= name.underscore.humanize.downcase %>."
5
- redirect_to <%= item_path('url') %>
6
- else
7
- render :action => 'edit'
8
- end
9
- end
@@ -1,3 +0,0 @@
1
- class <%= plural_class_name %>Controller < ApplicationController
2
- <%= controller_methods :actions %>
3
- end
@@ -1,25 +0,0 @@
1
- # this is now your file to do with as you see fit. Before you modify it though, make sure you
2
- # understand how the nested restful routes are defined in the routes.rb file!
3
-
4
- class <%= class_name %>EventsController < ApplicationController
5
-
6
- def create
7
- if request.post?
8
- @object = <%= class_name %>.find(params[:<%= object_id_name %>])
9
- event = params[:id]
10
- if <%= class_name %>.aasm_events.keys.include?(event.to_sym)
11
- respond_to do |format|
12
- if @object.send(event + "!")
13
- flash[:notice] = "Event '#{event}' was successfully performed."
14
- format.html { redirect_to(@object) }
15
- format.xml { render :xml => @object }
16
- else
17
- flash[:notice] = "Event '#{event}' was NOT successfully performed."
18
- format.html { redirect_to(@object) }
19
- format.xml { render :xml => @object.errors, :status => :unprocessable_entity }
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,9 +0,0 @@
1
- one:
2
- <%- for attribute in attributes -%>
3
- <%= attribute.name %>: <%= attribute.default %>
4
- <%- end -%>
5
-
6
- two:
7
- <%- for attribute in attributes -%>
8
- <%= attribute.name %>: <%= attribute.default %>
9
- <%- end -%>
@@ -1,2 +0,0 @@
1
- module <%= plural_class_name %>Helper
2
- end
@@ -1,11 +0,0 @@
1
- def test_create_invalid
2
- <%= class_name %>.any_instance.stubs(:valid?).returns(false)
3
- post :create
4
- assert_template 'new'
5
- end
6
-
7
- def test_create_valid
8
- <%= class_name %>.any_instance.stubs(:valid?).returns(true)
9
- post :create
10
- assert_redirected_to <%= item_path_for_test('url') %>
11
- end
@@ -1,6 +0,0 @@
1
- def test_destroy
2
- <%= singular_name %> = <%= class_name %>.first
3
- delete :destroy, :id => <%= singular_name %>
4
- assert_redirected_to <%= items_path('url') %>
5
- assert !<%= class_name %>.exists?(<%= singular_name %>.id)
6
- end
@@ -1,4 +0,0 @@
1
- def test_edit
2
- get :edit, :id => <%= class_name %>.first
3
- assert_template 'edit'
4
- end
@@ -1,4 +0,0 @@
1
- def test_index
2
- get :index
3
- assert_template 'index'
4
- end
@@ -1,4 +0,0 @@
1
- def test_new
2
- get :new
3
- assert_template 'new'
4
- end
@@ -1,4 +0,0 @@
1
- def test_show
2
- get :show, :id => <%= class_name %>.first
3
- assert_template 'show'
4
- end
@@ -1,11 +0,0 @@
1
- def test_update_invalid
2
- <%= class_name %>.any_instance.stubs(:valid?).returns(false)
3
- put :update, :id => <%= class_name %>.first
4
- assert_template 'edit'
5
- end
6
-
7
- def test_update_valid
8
- <%= class_name %>.any_instance.stubs(:valid?).returns(true)
9
- put :update, :id => <%= class_name %>.first
10
- assert_redirected_to <%= item_path_for_test('url') %>
11
- end
@@ -1,5 +0,0 @@
1
- require 'test_helper'
2
-
3
- class <%= plural_class_name %>ControllerTest < ActionController::TestCase
4
- <%= controller_methods 'tests/testunit/actions' %>
5
- end
@@ -1,7 +0,0 @@
1
- require 'test_helper'
2
-
3
- class <%= class_name %>Test < ActiveSupport::TestCase
4
- def test_should_be_valid
5
- assert <%= class_name %>.new.valid?
6
- end
7
- end
@@ -1,10 +0,0 @@
1
- <%% form_for @<%= singular_name %> do |f| %>
2
- <%%= f.error_messages %>
3
- <%- for attribute in attributes -%>
4
- <p>
5
- <%%= f.label :<%= attribute.name %> %><br />
6
- <%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
7
- </p>
8
- <%- end -%>
9
- <p><%%= f.submit "Submit" %></p>
10
- <%% end %>
@@ -1,12 +0,0 @@
1
- <%= render_form %>
2
-
3
- <%- if actions? :show, :index -%>
4
- <p>
5
- <%- if action? :show -%>
6
- <%%= link_to "Show", @<%= singular_name %> %> |
7
- <%- end -%>
8
- <%- if action? :index -%>
9
- <%%= link_to "View All", <%= plural_name %>_path %>
10
- <%- end -%>
11
- </p>
12
- <%- end -%>
@@ -1,27 +0,0 @@
1
- <table>
2
- <tr>
3
- <%- for attribute in attributes -%>
4
- <th><%= attribute.column.human_name.titleize %></th>
5
- <%- end -%>
6
- </tr>
7
- <%% for <%= singular_name %> in @<%= plural_name %> %>
8
- <tr>
9
- <%- for attribute in attributes -%>
10
- <td><%%=h <%= singular_name %>.<%= attribute.name %> %></td>
11
- <%- end -%>
12
- <%- if action? :show -%>
13
- <td><%%= link_to "Show", <%= singular_name %> %></td>
14
- <%- end -%>
15
- <%- if action? :edit -%>
16
- <td><%%= link_to "Edit", edit_<%= singular_name %>_path(<%= singular_name %>) %></td>
17
- <%- end -%>
18
- <%- if action? :destroy -%>
19
- <td><%%= link_to "Destroy", <%= singular_name %>, :confirm => 'Are you sure?', :method => :delete %></td>
20
- <%- end -%>
21
- </tr>
22
- <%% end %>
23
- </table>
24
-
25
- <%- if action? :new -%>
26
- <p><%%= link_to "New <%= singular_name.titleize %>", new_<%= singular_name %>_path %></p>
27
- <%- end -%>
@@ -1,5 +0,0 @@
1
- <%= render_form %>
2
-
3
- <%- if action? :index -%>
4
- <p><%%= link_to "Back to List", <%= plural_name %>_path %></p>
5
- <%- end -%>
@@ -1,26 +0,0 @@
1
- <%- for attribute in attributes -%>
2
- <p>
3
- <strong><%= attribute.column.human_name.titleize %>:</strong>
4
- <%%=h @<%= singular_name %>.<%= attribute.name %> %>
5
- </p>
6
- <%- end -%>
7
-
8
- <p>
9
- <strong>Current state: </strong><%%= @<%= singular_name %>.aasm_state.humanize %>
10
- </p>
11
-
12
- <p>
13
- <%% @<%= singular_name %>.aasm_events_for_current_state.each do |event| %>
14
- <%%= link_to_stonepath_event(@<%= singular_name %>, event) %> |
15
- <%% end %>
16
-
17
- <%- if action? :edit -%>
18
- <%%= link_to "Edit", edit_<%= singular_name %>_path(@<%= singular_name %>) %> |
19
- <%- end -%>
20
- <%- if action? :destroy -%>
21
- <%%= link_to "Destroy", @<%= singular_name %>, :confirm => 'Are you sure?', :method => :delete %> |
22
- <%- end -%>
23
- <%- if action? :index -%>
24
- <%%= link_to "View All", <%= plural_name %>_path %>
25
- <%- end -%>
26
- </p>