stonepath 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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>