platanus 0.0.15 → 0.0.16

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.
@@ -0,0 +1,78 @@
1
+ # enum.rb : ActiveRecord Enumerated Attributes.
2
+ #
3
+ # Copyright August 2012, Ignacio Baixas +mailto:ignacio@platan.us+.
4
+
5
+ module Platanus
6
+
7
+ ## Adds +attr_enum+ property generator to a module.
8
+ #
9
+ # When attr_enum is called on one of the model properties name:
10
+ # * A getter and setter for the <name>_str property are added, this allows the property to be accessed as a string,
11
+ # the string representations are obtained from the enumeration module's constants ::downcased:: names.
12
+ # * An inclusion validation is added for the property, only values included in the enumeration module's constants are allowed
13
+ #
14
+ # Given the following configuration:
15
+ #
16
+ # module Test
17
+ # ONE = 1
18
+ # TWO = 2
19
+ # THREE = 3
20
+ # end
21
+ #
22
+ # class Model
23
+ # include Platanus::Enum
24
+ #
25
+ # attr_enum :target, Test
26
+ # end
27
+ #
28
+ # One could do:
29
+ #
30
+ # t = Model.new
31
+ # t.target = Test.ONE
32
+ # t.target_str = 'one' # Same as above
33
+ # t.target = 5 # Generates a validation error
34
+ # t.target_str = # Raises an InvalidEnumName exception
35
+ #
36
+ module Enum
37
+
38
+ # Exception risen when an invalid value is passed to one of the _str= setters.
39
+ class InvalidEnumName < Exception; end
40
+
41
+ def self.included(base)
42
+ base.extend ClassMethods
43
+ end
44
+
45
+ module ClassMethods
46
+
47
+ def attr_enum(_target, _module, _options={})
48
+
49
+ map = {}
50
+ pname = _options.has_key?(:property_name) ? _options[:property_name] : (_target.to_s + '_str')
51
+
52
+ # Extract module constants
53
+ _module.constants.each { |cname| map[_module.const_get(cname)] = cname.to_s.downcase }
54
+
55
+ # Add string getter
56
+ self.send(:define_method, pname) do
57
+ map.fetch(self.send(_target), '')
58
+ end
59
+
60
+ # Add string setter
61
+ self.send(:define_method, pname + '=') do |value|
62
+ map.each_pair do |k,v|
63
+ if v == value
64
+ self.send(_target.to_s + '=', k)
65
+ return
66
+ end
67
+ end
68
+ raise InvalidEnumName
69
+ end
70
+
71
+ # Add value validator (unless validation is disabled)
72
+ self.validates _target, inclusion: { :in => map.keys } if _options.fetch(:validate, true)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+
@@ -1,3 +1,3 @@
1
1
  module Platanus
2
- VERSION = "0.0.15"
2
+ VERSION = "0.0.16"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: platanus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -29,6 +29,7 @@ files:
29
29
  - lib/platanus/api_base.rb
30
30
  - lib/platanus/canned.rb
31
31
  - lib/platanus/cmap.rb
32
+ - lib/platanus/enum.rb
32
33
  - lib/platanus/gcontroller.rb
33
34
  - lib/platanus/http_helpers.rb
34
35
  - lib/platanus/layered.rb