jeffp-enumerated_attribute 0.1.7 → 0.2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/.gitignore +8 -1
  2. data/README.rdoc +146 -32
  3. data/Rakefile +29 -14
  4. data/lib/enumerated_attribute.rb +0 -1
  5. data/lib/enumerated_attribute/attribute.rb +28 -26
  6. data/lib/enumerated_attribute/attribute/attribute_descriptor.rb +50 -0
  7. data/lib/enumerated_attribute/integrations/active_record.rb +6 -3
  8. data/lib/enumerated_attribute/integrations/object.rb +2 -1
  9. data/lib/enumerated_attribute/method_definition_dsl.rb +21 -11
  10. data/lib/enumerated_attribute/rails_helpers.rb +73 -0
  11. data/spec/active_record/active_record_spec.rb +49 -2
  12. data/spec/active_record/association_test_classes.rb +40 -0
  13. data/spec/active_record/associations_spec.rb +130 -0
  14. data/spec/active_record/test_in_memory.rb +40 -0
  15. data/spec/poro_spec.rb +32 -4
  16. data/spec/rails/README +243 -0
  17. data/spec/rails/Rakefile +10 -0
  18. data/spec/rails/app/controllers/application_controller.rb +10 -0
  19. data/spec/rails/app/controllers/form_test_controller.rb +38 -0
  20. data/spec/rails/app/helpers/application_helper.rb +3 -0
  21. data/spec/rails/app/helpers/form_test_helper.rb +2 -0
  22. data/spec/rails/app/models/user.rb +9 -0
  23. data/spec/rails/app/views/form_test/form.html.erb +1 -0
  24. data/spec/rails/app/views/form_test/form_for.html.erb +10 -0
  25. data/spec/rails/app/views/form_test/form_tag.html.erb +9 -0
  26. data/spec/rails/app/views/form_test/index.html.erb +6 -0
  27. data/spec/rails/app/views/layouts/application.html.erb +11 -0
  28. data/spec/rails/config/boot.rb +110 -0
  29. data/spec/rails/config/database.yml +22 -0
  30. data/spec/rails/config/environment.rb +45 -0
  31. data/spec/rails/config/environments/development.rb +17 -0
  32. data/spec/rails/config/environments/production.rb +28 -0
  33. data/spec/rails/config/environments/test.rb +28 -0
  34. data/spec/rails/config/initializers/backtrace_silencers.rb +7 -0
  35. data/spec/rails/config/initializers/inflections.rb +10 -0
  36. data/spec/rails/config/initializers/mime_types.rb +5 -0
  37. data/spec/rails/config/initializers/new_rails_defaults.rb +19 -0
  38. data/spec/rails/config/initializers/session_store.rb +15 -0
  39. data/spec/rails/config/locales/en.yml +5 -0
  40. data/spec/rails/config/routes.rb +43 -0
  41. data/spec/rails/db/development.sqlite3 +0 -0
  42. data/spec/rails/db/migrate/20090804230221_create_sessions.rb +16 -0
  43. data/spec/rails/db/migrate/20090804230546_create_users.rb +21 -0
  44. data/spec/rails/db/schema.rb +35 -0
  45. data/spec/rails/db/test.sqlite3 +0 -0
  46. data/spec/rails/public/404.html +30 -0
  47. data/spec/rails/public/422.html +30 -0
  48. data/spec/rails/public/500.html +30 -0
  49. data/spec/rails/public/favicon.ico +0 -0
  50. data/spec/rails/public/images/rails.png +0 -0
  51. data/spec/rails/public/index.html +275 -0
  52. data/spec/rails/public/javascripts/application.js +2 -0
  53. data/spec/rails/public/javascripts/controls.js +963 -0
  54. data/spec/rails/public/javascripts/dragdrop.js +973 -0
  55. data/spec/rails/public/javascripts/effects.js +1128 -0
  56. data/spec/rails/public/javascripts/prototype.js +4320 -0
  57. data/spec/rails/public/robots.txt +5 -0
  58. data/spec/rails/public/stylesheets/scaffold.css +54 -0
  59. data/spec/rails/script/about +4 -0
  60. data/spec/rails/script/autospec +6 -0
  61. data/spec/rails/script/console +3 -0
  62. data/spec/rails/script/dbconsole +3 -0
  63. data/spec/rails/script/destroy +3 -0
  64. data/spec/rails/script/generate +3 -0
  65. data/spec/rails/script/performance/benchmarker +3 -0
  66. data/spec/rails/script/performance/profiler +3 -0
  67. data/spec/rails/script/plugin +3 -0
  68. data/spec/rails/script/runner +3 -0
  69. data/spec/rails/script/server +3 -0
  70. data/spec/rails/script/spec +10 -0
  71. data/spec/rails/script/spec_server +9 -0
  72. data/spec/rails/spec/controllers/form_test_controller_spec.rb +41 -0
  73. data/spec/rails/spec/integrations/enum_select_spec.rb +73 -0
  74. data/spec/rails/spec/matchers.rb +12 -0
  75. data/spec/rails/spec/rcov.opts +2 -0
  76. data/spec/rails/spec/spec.opts +4 -0
  77. data/spec/rails/spec/spec_helper.rb +38 -0
  78. data/spec/rails/spec/views/form_test/form.html.erb_spec.rb +12 -0
  79. data/spec/rails/spec/views/form_test/form_for.html.erb_spec.rb +12 -0
  80. data/spec/rails/spec/views/form_test/form_tag.html.erb_spec.rb +12 -0
  81. data/spec/rcov.opts +2 -0
  82. data/spec/spec.opts +4 -0
  83. data/spec/tractor.rb +4 -1
  84. metadata +103 -5
data/.gitignore CHANGED
@@ -1,5 +1,12 @@
1
1
  .DS_Store
2
+ **/*.log
2
3
  pkg
3
4
  rdoc
4
5
  coverage
5
- *.log
6
+ doc
7
+ log
8
+ nbproject
9
+ tmp
10
+ vendor
11
+ lib/tasks/*
12
+ TODO.rdoc
@@ -1,6 +1,8 @@
1
1
  = enumerated_attribute
2
2
 
3
- +enumerated_attribute+ simplifies the definition of enumeration-based attributes, their accessors, initializers and common predicate and enumeration methods.
3
+ Easily code enumerations for your models and expose them as
4
+ drop-down lists with the +enum_select+ helper, or use any of +enumerated_attribute+
5
+ features to simplify coding enumerations in any Ruby object.
4
6
 
5
7
  == Resources
6
8
 
@@ -12,13 +14,16 @@ Source
12
14
 
13
15
  * git://github.com/jeffp/enumerated_attribute.git
14
16
 
17
+ Install
18
+
19
+ * sudo gem install jeffp-enumerated_attribute --source=http://gems.github.com
20
+
15
21
  == Description
16
22
 
17
23
  Enumerations are a common and useful pattern in programming. Typically, in Ruby,
18
24
  enumerated attributes are implemented with strings, symbols or constants. Often the
19
25
  developer is burdened with repeatedly defining common methods in support of each
20
- attribute. Such repetition coding unnecessarily increases
21
- costs and wastes time.
26
+ attribute. Such repetition coding unnecessarily increases costs and wastes time.
22
27
 
23
28
  +enumerated_attribute+ simplifies the definition of enumerated attributes by emphasizing
24
29
  convention and DRYing the implementation. Repetitive code such as initializers, accessors,
@@ -26,32 +31,78 @@ predicate and enumeration methods are automatically generated, resulting in bett
26
31
  encapsulation, quicker implementation and cleaner code.
27
32
 
28
33
  Features include:
29
- * Short and simple definition
34
+ * ActiveRecord integration
35
+ * ActionView form helpers
36
+ * Configurable enumeration labels
30
37
  * Auto-defined attribute methods
31
38
  * Dynamically-generated predicate methods
32
- * Attribute initialization
33
- * Method definition short-hand (DSL)
34
- * ActiveRecord integration
39
+ * Automatic initialization
40
+ * Advanced configuration DSL
41
+
42
+ == Setup
43
+
44
+ For a Ruby application, install the gem and require it
45
+
46
+ require 'enumerated_attribute'
47
+
48
+ or for a rails application configure the gem in the config block of the
49
+ config/environment.rb file
50
+
51
+ config.gem "jeffp-enumerated_attribute", :lib=>"enumerated_attribute"
52
+
53
+ and run the gem install rake task
54
+
55
+ rake gems:install
56
+
35
57
 
36
- == Example
58
+ == Rails Example
37
59
 
38
- Here's a quick example of what +enumerated_attribute+ can do:
60
+ Here's an example of +enumerated_attribute+ features in a Rails application:
61
+
62
+ In the migration, declare your enumeration attributes with +enum+
63
+
64
+ create_table :users, :force=>true do |t|
65
+ t.string :first_name
66
+ t.enum :gender
67
+ t.enum :degree
68
+ ...
69
+ end
70
+
71
+ Define the enumerations in your models with +enum_attr+
72
+
73
+ class User < ActiveRecord::Base
74
+ enum_attr :gender, %w(male female)
75
+ enum_attr :degree, %w(^none high_school college graduate)
76
+ end
77
+
78
+ Expose the enumeration in your forms with +enum_select+
79
+
80
+ <% form_for :user do |f| %>
81
+ <%= f.label :user %> <%= f.text_field :first_name %><br/>
82
+ <%= f.label :gender %> <%= f.enum_select :gender %><br/>
83
+ <%= f.label :degree %> <%= f.enum_select :degree %><br/>
84
+ <%= submit_tag 'save' %>
85
+ <% end %>
86
+
87
+ The select options text can be customized. See 'Customizing Labels' in the Integration section.
88
+
89
+ == Ruby Example
90
+
91
+ Here's an example of +enumerated_attribute+ features in a Ruby application:
39
92
 
40
93
  require 'enumerated_attribute'
41
94
 
42
95
  class Tractor
43
- enum_attr :gear, %w(reverse ^neutral first second over_drive) do
44
- driving? [:first, :second, :over_drive]
45
- upshift { self.gear_is_not_in_over_drive? ? self.gear_next : self.gear }
46
- end
96
+ enum_attr :gear, %w(reverse ^neutral first second over_drive)
97
+
47
98
  end
48
99
 
49
100
  t = Tractor.new
50
101
  t.gear # => :neutral
51
- t.gear_is_neutral? # => true
52
- t.driving? # => false
53
- t.upshift # => :first
54
- t.driving? # => true
102
+ t.neutral? # => true
103
+ t.gear_next # => :first
104
+ t.not_neutral? # => true
105
+ t.gear_previous # => :neutral
55
106
  t.gear = :second # => :second
56
107
  t.gear_is_not_in_first? # => true
57
108
 
@@ -203,22 +254,25 @@ Alternatively, the :init option can be used to indicate the initial value of the
203
254
 
204
255
  ==== Setting Attributes to nil
205
256
 
206
- By default, the attribute setter does not allow nils unless the :nil option is set to true
207
- in the definition as demonstrated here:
257
+ By default, the attribute setter allows nils unless the :nil option is set to false.
258
+ When :nil is set to false, the attribute may initialize to nil, but may not be set
259
+ to nil thereafter.
208
260
 
209
261
  class Tractor
210
- enum_attr :plow %w(^up down), :nil=>true
262
+ enum_attr :plow, %w(up down), :nil=>false
211
263
  end
212
264
 
213
265
  t = Tractor.new
214
- t.plow # => :up
215
- t.plow_nil? # => :false
216
- t.plow = nil # => nil
217
- t.plow_is_nil? # => true
218
- t.plow_is_not_nil? # => false
266
+ t.plow # => nil
267
+ t.plow_nil? # => true
268
+ t.plow = :up # => :up
269
+ t.plow_is_nil? # => false
270
+ t.plow_is_not_nil? # => true
271
+ t.plow = nil # => raises error
219
272
 
220
273
  Regardless of the :nil option setting, the plugin can dynamically recognize and define
221
- predicate methods for testing 'nil' values.
274
+ predicate methods for testing 'nil' values. The setter methods also treat empty
275
+ strings (or '') as nil values.
222
276
 
223
277
 
224
278
  ==== Changing Method Names
@@ -357,6 +411,62 @@ enumeration functionality is consistent across integrations.
357
411
  o.invoice # => "43556334-W84"
358
412
 
359
413
 
414
+ ==== Labels
415
+
416
+ Each enumeration value has a corresponding text label. The defaults are made
417
+ up from the enumeration symbols. For the Tractor class example:
418
+
419
+ t=Tractor.new
420
+ t.enums(:gear) # => [:reverse, :neutral, :first, :second, :over_drive]
421
+ t.enums(:gear).labels # => ['Reverse', 'Neutral', 'First', 'Second', 'Over drive']
422
+
423
+ The +enums(:attribute)+ method provides information about the attribute's enumerations.
424
+ It is the same as the plural form of the attribute name. There are several kinds
425
+ of information available from the +enums+ method.
426
+
427
+ t=Tractor.new
428
+ e = t.enums(:plow) # => [:up, :down]
429
+ e.labels # => ['Up', 'Down']
430
+ e.hash # => {:up=>'Up', :down=>'Down'}
431
+ e.select_options # => [['Up', 'up'], ['Down', 'down']]
432
+ e.label(:up) # => 'Up'
433
+
434
+ ==== Customizing Labels
435
+
436
+ Labels can be customized as shown here:
437
+
438
+ class User < ActiveRecord::Base
439
+ enum_attr :contact_options, %w(none phone email mail) do
440
+ label :none=>'Please do not contact me'
441
+ label :phone=>'I would like a representative to call me'
442
+ label :email=>'I would like information via email'
443
+ label :mail=>'I would like information mailed to me'
444
+ end
445
+ end
446
+
447
+ Likewise, the labels can be provided on the same line
448
+
449
+ class Tractor
450
+ enum_attr :gear, %w(reverse ^neutral first second over_drive) do
451
+ labels :first=>'1st Gear', :second=>'2nd Gear', :over_drive=>'Over Drive'
452
+ end
453
+ end
454
+
455
+ ==== View Helpers
456
+
457
+ There are two +enum_select+ helpers, one for use with +form_for+ and one for use without
458
+ it. An example for form_for was given in the examples at the beginning. Here's an
459
+ example with the +form_tag+ and a @user object.
460
+
461
+ <% form_tag :action=>:register do %>
462
+ <%= label_tag 'First name' %>: <%= text_field :user, :first_name %><br/>
463
+ <%= label_tag 'Gender' %>: <%= enum_select :user, :gender %><br/>
464
+ <%= label_tag 'Degree' %>: <%= enum_select :user, :degree %><br/>
465
+ ...
466
+ <%= submit_tag 'Register' %>
467
+ <% end %>
468
+
469
+
360
470
  === Implementation Notes
361
471
 
362
472
  ==== New and Method_missing methods
@@ -366,7 +476,7 @@ implementations in the same class declaring an enumerated_attribute should come
366
476
  declaration; otherwise, the 'new' and 'method_missing' implementations must chain in order to avoid
367
477
  overwriting the plugin's methods. The best approach is shown here:
368
478
 
369
- class A
479
+ class Soup
370
480
  def self.new(*args)
371
481
  ...
372
482
  end
@@ -376,24 +486,28 @@ overwriting the plugin's methods. The best approach is shown here:
376
486
  ...
377
487
  end
378
488
 
379
- enum_attr :state, %w(cold warm hot boiling)
489
+ enum_attr temp:, %w(cold warm hot boiling)
380
490
  end
381
491
 
382
492
 
383
493
  == Testing
384
494
 
385
- The plugin uses RSpec for testing. Make sure you have the RSpec gem installed:
495
+ The plugin uses RSpec and Webrat for testing. Make sure you have the RSpec gem installed:
386
496
 
387
- gem install rspec
497
+ gem install rspec webrat
388
498
 
389
499
  To test the plugin for regular ruby objects, run:
390
500
 
391
- rake spec
501
+ rake spec:object
392
502
 
393
503
  Testing ActiveRecord integration requires the install of Sqlite3 and the
394
504
  sqlite3-ruby gem. To test ActiveRecord, run:
395
505
 
396
506
  rake spec:active_record
507
+
508
+ And for testing +enum_select+ in form views:
509
+
510
+ rake spec:forms
397
511
 
398
512
  To test all specs:
399
513
 
@@ -402,5 +516,5 @@ To test all specs:
402
516
 
403
517
  == Dependencies
404
518
 
405
- * ActiveRecord
519
+ * ActiveRecord (but not required)
406
520
  * Sqlite3 and sqlite3-ruby gem (for testing)
data/Rakefile CHANGED
@@ -5,12 +5,14 @@ require 'rake/contrib/sshpublisher'
5
5
 
6
6
  spec = Gem::Specification.new do |s|
7
7
  s.name = 'enumerated_attribute'
8
- s.version = '0.1.7'
8
+ s.version = '0.2.0.2'
9
9
  s.platform = Gem::Platform::RUBY
10
- s.description = 'An enumerated attribute accessor'
11
- s.summary = 'Add enumerated attributes with initialization, dynamic predicate methods, more ...'
10
+ s.description = 'Enumerated model attributes and view helpers'
11
+ s.summary = 'Add enumerated attributes to your models and expose them in drop-down lists in your views'
12
12
 
13
- s.files = FileList['{examples,lib,tasks,spec}/**/*'] + %w(CHANGELOG.rdoc init.rb LICENSE Rakefile README.rdoc .gitignore) - FileList['**/*.log']
13
+ exclude_folders = 'spec/rails/{doc,lib,log,nbproject,tmp,vendor,test}'
14
+ exclude_files = FileList['**/*.log'] + FileList[exclude_folders+'/**/*'] + FileList[exclude_folders]
15
+ s.files = FileList['{examples,lib,tasks,spec}/**/*'] + %w(CHANGELOG.rdoc init.rb LICENSE Rakefile README.rdoc .gitignore) - exclude_files
14
16
  s.require_path = 'lib'
15
17
  s.has_rdoc = true
16
18
  s.test_files = Dir['spec/*_spec.rb']
@@ -24,24 +26,37 @@ require 'spec/version'
24
26
  require 'spec/rake/spectask'
25
27
 
26
28
  desc "Run specs"
27
- Spec::Rake::SpecTask.new(:spec) do |t|
28
- t.spec_files = FileList['spec/*_spec.rb']
29
- t.libs << 'lib' << 'spec'
30
- t.rcov = false
31
- #t.spec_opts = ['--options', 'spec/spec.opts']
32
- #t.rcov_dir = 'coverage'
33
- #t.rcov_opts = ['--exclude', "kernel,load-diff-lcs\.rb,instance_exec\.rb,lib/spec.rb,lib/spec/runner.rb,^spec/*,bin/spec,examples,/gems,/Library/Ruby,\.autotest,#{ENV['GEM_HOME']}"]
34
- end
35
29
 
36
30
  namespace :spec do
31
+ task :default=>:object
32
+ Spec::Rake::SpecTask.new(:object) do |t|
33
+ t.spec_files = FileList['spec/*_spec.rb']
34
+ t.libs << 'lib' << 'spec'
35
+ t.rcov = false
36
+ t.spec_opts = ['--options', 'spec/spec.opts']
37
+ #t.rcov_dir = 'coverage'
38
+ #t.rcov_opts = ['--exclude', "kernel,load-diff-lcs\.rb,instance_exec\.rb,lib/spec.rb,lib/spec/runner.rb,^spec/*,bin/spec,examples,/gems,/Library/Ruby,\.autotest,#{ENV['GEM_HOME']}"]
39
+ end
37
40
  desc "Run ActiveRecord integration specs"
38
41
  Spec::Rake::SpecTask.new(:active_record) do |t|
39
42
  t.spec_files = FileList['spec/active_record/*_spec.rb']
40
43
  t.libs << 'lib' << 'spec/active_record'
44
+ t.spec_opts = ['--options', 'spec/spec.opts']
45
+ t.rcov = false
46
+ end
47
+ Spec::Rake::SpecTask.new(:forms) do |t|
48
+ t.spec_files = FileList['spec/rails/spec/integrations/*_spec.rb']
49
+ t.libs << 'lib' << 'spec/rails/spec'
50
+ t.spec_opts = ['--options', 'spec/spec.opts']
41
51
  t.rcov = false
42
52
  end
53
+ # Spec::Rake::SpecTask.new(:associations) do |t|
54
+ # t.spec_files = FileList['spec/active_record/associations_spec.rb']
55
+ # t.libs << 'lib' << 'spec/active_record'
56
+ # t.rcov = false
57
+ # end
43
58
  desc "Run all specs"
44
- task :all=>[:spec, :active_record]
59
+ task :all=>[:object, :active_record, :forms]
45
60
  end
46
61
 
47
62
 
@@ -63,7 +78,7 @@ end
63
78
 
64
79
  Rake::GemPackageTask.new(spec) do |p|
65
80
  p.gem_spec = spec
66
- p.need_tar = true
81
+ p.need_tar = RUBY_PLATFORM =~ /mswin/ ? false : true
67
82
  p.need_zip = true
68
83
  end
69
84
 
@@ -20,4 +20,3 @@ Class.class_eval do
20
20
  include EnumeratedAttribute::MacroMethods
21
21
  end
22
22
 
23
-
@@ -1,5 +1,8 @@
1
+ require 'enumerated_attribute/attribute/attribute_descriptor'
1
2
  require 'enumerated_attribute/method_definition_dsl'
2
3
  require 'enumerated_attribute/integrations'
4
+ require 'enumerated_attribute/rails_helpers'
5
+
3
6
 
4
7
  module EnumeratedAttribute
5
8
 
@@ -24,7 +27,7 @@ module EnumeratedAttribute
24
27
 
25
28
  initial_value = nil
26
29
  plural_name = opts[:plural] || opts[:enums_accessor] || opts[:enums] || begin
27
- case
30
+ case
28
31
  when attr_name =~ /[aeiou]y$/
29
32
  "#{attr_name}s"
30
33
  when attr_name =~ /y$/
@@ -38,15 +41,13 @@ module EnumeratedAttribute
38
41
  incrementor = opts[:incrementor] || opts[:inc] || "#{attr_name}_next"
39
42
  decrementor = opts[:decrementor] || opts[:dec] || "#{attr_name}_previous"
40
43
 
41
- enums = enums.map{|v| (v =~ /^\^/ ? (initial_value = v[1, v.length-1].to_sym) : v.to_sym )}
42
-
44
+ enums = enums.map{|v| (v =~ /^\^/ ? (initial_value ||= v[1, v.length-1].to_sym) : v.to_sym )}
45
+
43
46
  class_eval <<-ATTRIB
44
- @@enumerated_attribute_names ||= []
45
- @@enumerated_attribute_names << '#{attr_name}'
46
- @@enumerated_attribute_options ||={}
47
- @@enumerated_attribute_options[:#{attr_name}] = {#{opts.to_a.map{|v| ':'+v.first.to_s+'=>:'+v.last.to_s}.join(', ')}}
48
- @@enumerated_attribute_values ||= {}
49
- @@enumerated_attribute_values[:#{attr_name}] = [:#{enums.join(',:')}]
47
+ def self.enumerated_attributes; @@enumerated_attributes; end
48
+ def enums(attr); @@enumerated_attributes[attr.to_sym]; end
49
+ @@enumerated_attributes ||= {}
50
+ @@enumerated_attributes[:#{attr_name}] = AttributeDescriptor.new(:#{attr_name}, #{enums.inspect}, #{opts.inspect})
50
51
  ATTRIB
51
52
 
52
53
  #define_enumerated_attribute_[writer, reader] may be modified in a named Integrations module (see Integrations::ActiveRecord)
@@ -60,16 +61,17 @@ module EnumeratedAttribute
60
61
  include(@integration_map[:module]) if @integration_map[:module]
61
62
 
62
63
  def self.has_enumerated_attribute?(name)
63
- @@enumerated_attribute_names.include?(name.to_s)
64
+ return(false) if name.nil?
65
+ @@enumerated_attributes.key?(name.to_sym)
64
66
  end
65
67
  def self.enumerated_attribute_allows_nil?(name)
66
- return (false) unless @@enumerated_attribute_options[name.to_sym]
67
- @@enumerated_attribute_options[name.to_sym][:nil] || false
68
+ return(false) unless (descriptor = @@enumerated_attributes[name.to_sym])
69
+ descriptor.allows_nil?
68
70
  end
69
71
  def self.enumerated_attribute_allows_value?(name, value)
70
- return (false) unless @@enumerated_attribute_values[name.to_sym]
71
- return enumerated_attribute_allows_nil?(name) if value == nil
72
- @@enumerated_attribute_values[name.to_sym].include?(value.to_sym)
72
+ return (false) unless (descriptor = @@enumerated_attributes[name.to_sym])
73
+ return descriptor.allows_nil? if (value == nil || value == '')
74
+ descriptor.allows_value?(value)
73
75
  end
74
76
  end
75
77
  MAP
@@ -114,7 +116,7 @@ module EnumeratedAttribute
114
116
  middle = meth_name.chop #remove the ?
115
117
 
116
118
  attr = nil
117
- @@enumerated_attribute_names.each do |name|
119
+ @@enumerated_attributes.keys.each do |name|
118
120
  if middle.sub!(Regexp.new("^"+name.to_s), "")
119
121
  attr = name; break
120
122
  end
@@ -122,16 +124,16 @@ module EnumeratedAttribute
122
124
 
123
125
  value = nil
124
126
  attr_sym = attr ? attr.to_sym : nil
125
- if (enum_values = @@enumerated_attribute_values[attr_sym] ) #nil if [nil]
126
- enum_values.each do |v|
127
+ if (descriptor = @@enumerated_attributes[attr_sym])
128
+ descriptor.enums.each do |v|
127
129
  if middle.sub!(Regexp.new(v.to_s+"$"), "")
128
130
  value = v; break
129
131
  end
130
132
  end
131
133
  else
132
134
  #search through enum values one at time and identify any ambiguities
133
- @@enumerated_attribute_values.each do |attr_key,enums|
134
- enums.each do|v|
135
+ @@enumerated_attributes.each do |attr_key,descriptor|
136
+ descriptor.enums.each do|v|
135
137
  if middle.match(v.to_s+"$")
136
138
  raise(AmbiguousMethod, meth_name+" is ambiguous, use something like "+attr_sym.to_s+(middle[0,1]=='_'? '' : '_')+middle+"? or "+attr_key.to_s+(middle[0,1]=='_'? '' : '_')+middle+"?", caller) if attr_sym
137
139
  attr_sym = attr_key
@@ -170,7 +172,7 @@ module EnumeratedAttribute
170
172
  #create state and action methods from block
171
173
  initial_value = opts[:init] || initial_value
172
174
  if block_given?
173
- m = EnumeratedAttribute::MethodDefinitionDSL.new(self, attr_name, enums)
175
+ m = EnumeratedAttribute::MethodDefinitionDSL.new(self, enumerated_attributes[attr_sym]) #attr_name, enums)
174
176
  m.instance_eval(&block)
175
177
  initial_value = m.initial_value || initial_value
176
178
  plural_name = m.pluralized_name || plural_name
@@ -181,16 +183,16 @@ module EnumeratedAttribute
181
183
  #define the enum values accessor
182
184
  class_eval <<-ENUM
183
185
  def #{plural_name}
184
- @@enumerated_attribute_values[:#{attr_name}]
186
+ @@enumerated_attributes[:#{attr_name}]
185
187
  end
186
188
  def #{incrementor}
187
- z = @@enumerated_attribute_values[:#{attr_name}]
188
- index = z.index(@#{attr_name})
189
+ z = @@enumerated_attributes[:#{attr_name}].enums
190
+ index = z.index(read_enumerated_attribute(:#{attr_name}))
189
191
  write_enumerated_attribute(:#{attr_name}, z[index >= z.size-1 ? 0 : index+1])
190
192
  end
191
193
  def #{decrementor}
192
- z = @@enumerated_attribute_values[:#{attr_name}]
193
- index = z.index(@#{attr_name})
194
+ z = @@enumerated_attributes[:#{attr_name}].enums
195
+ index = z.index(read_enumerated_attribute(:#{attr_name}))
194
196
  write_enumerated_attribute(:#{attr_name}, z[index > 0 ? index-1 : z.size-1])
195
197
  end
196
198
  ENUM