typed_fields 0.0.1 → 0.0.2

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.
@@ -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