haz_enum 0.3.0 → 0.4.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.
- data/CHANGESET +2 -0
- data/VERSION +1 -1
- data/haz_enum.gemspec +3 -2
- data/lib/haz_enum/set.rb +43 -24
- data/spec/set_spec.rb +7 -0
- data/spec/spec_helper.rb +6 -0
- metadata +4 -3
data/CHANGESET
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/haz_enum.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{haz_enum}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["thyphoon"]
|
12
|
-
s.date = %q{2010-06-
|
12
|
+
s.date = %q{2010-06-28}
|
13
13
|
s.description = %q{use has_set and has_enum in your ActiveRecord models if you want to have one (has_enum) value from a defined enumeration or more (has_set))}
|
14
14
|
s.email = %q{andi@galaxycats.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.files = [
|
20
20
|
".document",
|
21
21
|
".gitignore",
|
22
|
+
"CHANGESET",
|
22
23
|
"LICENSE",
|
23
24
|
"README.rdoc",
|
24
25
|
"Rakefile",
|
data/lib/haz_enum/set.rb
CHANGED
@@ -4,16 +4,10 @@ module HazEnum
|
|
4
4
|
|
5
5
|
field_type = options.has_key?(:field_type) ? options[:field_type].to_s : "bitfield"
|
6
6
|
set_column = options.has_key?(:column_name) ? options[:column_name].to_s : "#{set_name}_#{field_type}"
|
7
|
-
enum_class = options.has_key?(:class_name) ?
|
7
|
+
enum_class = options.has_key?(:class_name) ? options[:class_name].to_s.camelize.constantize : set_name.to_s.camelize.constantize
|
8
8
|
|
9
|
-
after_find "initialize_#{set_name}
|
10
|
-
before_save "convert_#{set_name}
|
11
|
-
|
12
|
-
enum_class.class_eval do
|
13
|
-
def bitfield_index
|
14
|
-
index + 1
|
15
|
-
end
|
16
|
-
end unless enum_class.method_defined?(:bitfield_index)
|
9
|
+
after_find "initialize_#{set_name}_from_#{field_type}"
|
10
|
+
before_save "convert_#{set_name}_to_#{field_type}"
|
17
11
|
|
18
12
|
define_method("#{set_name}") do
|
19
13
|
instance_variable_get("@#{set_name}")
|
@@ -31,28 +25,53 @@ module HazEnum
|
|
31
25
|
end
|
32
26
|
|
33
27
|
define_method("#{set_name}_changed?") do
|
34
|
-
send("convert_#{set_name}
|
28
|
+
send("convert_#{set_name}_to_#{field_type}")
|
35
29
|
send("#{set_column}_changed?")
|
36
30
|
end
|
37
31
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
32
|
+
if field_type == "bitfield"
|
33
|
+
|
34
|
+
enum_class.class_eval do
|
35
|
+
def bitfield_index
|
36
|
+
index + 1
|
37
|
+
end
|
38
|
+
end unless enum_class.method_defined?(:bitfield_index)
|
39
|
+
|
40
|
+
define_method("convert_#{set_name}_to_bitfield") do
|
41
|
+
self[set_column] = 0
|
42
|
+
if send(set_name)
|
43
|
+
send(set_name).each do |element|
|
44
|
+
2**element.bitfield_index & self[set_column] == 2**element.bitfield_index ? next : self[set_column] += 2**element.bitfield_index
|
45
|
+
end
|
43
46
|
end
|
44
47
|
end
|
45
|
-
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
define_method("initialize_#{set_name}_from_bitfield") do
|
50
|
+
if self[set_column]
|
51
|
+
set_elements = enum_class.values.collect do |enum_element|
|
52
|
+
enum_element if ((2**enum_element.bitfield_index & self[set_column]) == 2**enum_element.bitfield_index)
|
53
|
+
end.compact
|
54
|
+
send("#{set_name}=", set_elements)
|
55
|
+
else
|
56
|
+
self[set_column] = 0
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
elsif field_type == "yml"
|
61
|
+
|
62
|
+
define_method("convert_#{set_name}_to_yml") do
|
63
|
+
self[set_column] = YAML::dump(send(set_name))
|
64
|
+
end
|
65
|
+
|
66
|
+
define_method("initialize_#{set_name}_from_yml") do
|
67
|
+
deserialized_value = unless self[set_column].is_a?(String) && self[set_column] =~ /^---/
|
68
|
+
self[set_column]
|
69
|
+
else
|
70
|
+
(YAML::load(self[set_column]) || []) rescue self[set_column]
|
71
|
+
end
|
72
|
+
send("#{set_name}=", deserialized_value)
|
55
73
|
end
|
74
|
+
|
56
75
|
end
|
57
76
|
end
|
58
77
|
end
|
data/spec/set_spec.rb
CHANGED
@@ -17,6 +17,13 @@ describe "HazEnum" do
|
|
17
17
|
ClassWithSet.new(:roles => [Roles::User, Roles::Admin]).roles[1].should be(Roles::Admin)
|
18
18
|
end
|
19
19
|
|
20
|
+
it "should be able to save values as yml" do
|
21
|
+
YmlSet.new(:roles => [Roles::User, Roles::Admin]).roles[1].should be(Roles::Admin)
|
22
|
+
yml_set = YmlSet.create(:roles => [Roles::User, Roles::Admin])
|
23
|
+
yml_set.reload
|
24
|
+
yml_set.roles[1].should be(Roles::Admin)
|
25
|
+
end
|
26
|
+
|
20
27
|
it "should not be able to set set-values by colum-name via hash in initializer" do
|
21
28
|
lambda { ClassWithEnum.new(:roles_bitfield => 3) }.should raise_error
|
22
29
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -30,6 +30,7 @@ def setup_db
|
|
30
30
|
create_table :class_with_sets do |t|
|
31
31
|
t.column :title, :string
|
32
32
|
t.column :roles_bitfield, :integer
|
33
|
+
t.column :roles_yml, :text
|
33
34
|
t.column :created_at, :datetime
|
34
35
|
t.column :updated_at, :datetime
|
35
36
|
end
|
@@ -75,6 +76,11 @@ class ClassWithSet < ActiveRecord::Base
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
79
|
+
class YmlSet < ActiveRecord::Base
|
80
|
+
set_table_name "class_with_sets"
|
81
|
+
has_set :roles, :field_type => :yml
|
82
|
+
end
|
83
|
+
|
78
84
|
class ClassWithCustomNameSet < ActiveRecord::Base
|
79
85
|
has_set :roles, :column_name => :custom_name
|
80
86
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 4
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.4.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- thyphoon
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-28 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -58,6 +58,7 @@ extra_rdoc_files:
|
|
58
58
|
files:
|
59
59
|
- .document
|
60
60
|
- .gitignore
|
61
|
+
- CHANGESET
|
61
62
|
- LICENSE
|
62
63
|
- README.rdoc
|
63
64
|
- Rakefile
|