typed_fields 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,3 @@
1
1
  module TypedFields
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/typed_fields.rb CHANGED
@@ -46,6 +46,18 @@ module TypedFields
46
46
  obj.map{|o| @type.parse o}
47
47
  end
48
48
  end
49
+
50
+ class ProcType
51
+ def initialize proc
52
+ @proc = proc
53
+ end
54
+
55
+ def parse obj
56
+ @proc.call obj
57
+ end
58
+ end
59
+
60
+ TypeInfo = Struct.new(:field_name, :type, :default)
49
61
 
50
62
  module ClassMethods
51
63
  { :object => ObjectType.new,
@@ -70,45 +82,65 @@ module TypedFields
70
82
  if class_variable_defined?(name)
71
83
  class_variable_get(name)
72
84
  else
73
- class_variable_set(name, {})
85
+ class_variable_set(name, [])
74
86
  end
75
87
  end
76
88
 
77
89
  private
78
90
  def declare_fields params, type
79
91
  options = params.last.is_a?(Hash) ? params.pop : {}
80
- options[:type] ||= type
92
+ type = extract_type(options, type)
93
+ default = extract_default(options)
81
94
 
82
95
  params.each do |field_name|
83
- saved_type_info[field_name] = options
96
+ saved_type_info << TypeInfo.new(field_name, type, default)
84
97
  end
85
98
  end
99
+
100
+ def extract_type options, type
101
+ t = options[:type] || type
102
+ t.respond_to?(:call) ? ProcType.new(t) : t
103
+ end
104
+
105
+ def extract_default options
106
+ options[:default]
107
+ end
86
108
  end
87
109
 
88
110
  module InstanceMethods
89
111
  def initialize_fields params
90
- set_default_values
91
- params.each do |field_name, value|
92
- set_value field_name, value
112
+ self.class.saved_type_info.each do |type_info|
113
+ value = value_for params, type_info
114
+ set_value type_info.field_name, value
93
115
  end
94
116
  end
95
117
 
96
118
  private
119
+
120
+ def value_for params, type_info
121
+ if passed_value_for? params, type_info
122
+ value = parse_passed_value params, type_info
123
+ else
124
+ value = default_value type_info
125
+ end
126
+ end
127
+
128
+ def passed_value_for? params, type_info
129
+ params.has_key?(type_info.field_name)
130
+ end
131
+
132
+ def default_value type_info
133
+ d = type_info.default
134
+ d.respond_to?(:call) ? d.call(self) : d
135
+ end
136
+
137
+ def parse_passed_value params, type_info
138
+ passed_value = params[type_info.field_name]
139
+ type_info.type.parse(passed_value)
140
+ end
97
141
 
98
142
  def set_value field_name, value
99
- type_info = self.class.saved_type_info[field_name]
100
- return unless type_info
101
- type = type_info[:type]
102
- parsed_value = type.parse(value)
103
- instance_variable_set "@#{field_name.to_s}", parsed_value
104
- end
105
-
106
- def set_default_values
107
- self.class.saved_type_info.each do |field_name, options|
108
- default_value = options[:default]
109
- default_value = default_value.call(self) if default_value.respond_to? :call
110
- set_value field_name, default_value
111
- end
143
+ instance_variable_set "@#{field_name.to_s}", value
112
144
  end
113
145
  end
114
146
 
@@ -99,12 +99,18 @@ describe TypedFields do
99
99
  f(:field).should == [1,2]
100
100
  end
101
101
 
102
- it "should use custom type" do
102
+ it "should use a custom type" do
103
103
  type = stub(:parse => "parsed")
104
104
  clazz.custom :field, :type => type
105
105
  object.initialize_fields(:field => nil)
106
106
  f(:field).should == "parsed"
107
107
  end
108
+
109
+ it "should use Proc as a custom type" do
110
+ clazz.custom :field, :type => Proc.new{|s| s.upcase}
111
+ object.initialize_fields(:field => "abc")
112
+ f(:field).should == "ABC"
113
+ end
108
114
  end
109
115
 
110
116
  context "inheritance" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typed_fields
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-25 00:00:00.000000000Z
12
+ date: 2011-12-26 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &2156932540 !ruby/object:Gem::Requirement
16
+ requirement: &2157005440 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *2156932540
24
+ version_requirements: *2157005440
25
25
  description: ''
26
26
  email:
27
27
  - vic.savkin@gmail.com