casting_attributes 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,30 @@
1
+ module CastingAttributes
2
+ module TypeCaster
3
+
4
+ class Base
5
+ attr_reader :model, :attribute
6
+
7
+ def initialize(model, attr)
8
+ @model = model
9
+ @attribute = attr
10
+ end
11
+
12
+ def storage_var
13
+ :"@#{attribute}"
14
+ end
15
+
16
+ def readers
17
+ [attribute]
18
+ end
19
+
20
+ def writers
21
+ [:"#{attribute}="]
22
+ end
23
+
24
+ def typecast(value)
25
+ raise NotImplementedError.new
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ module CastingAttributes
2
+ module TypeCaster
3
+
4
+ class Boolean < Base
5
+ def attribute
6
+ super.to_s.gsub('?', '').to_sym
7
+ end
8
+
9
+ def readers
10
+ super << :"#{attribute}?"
11
+ end
12
+
13
+ def typecast(value)
14
+ case value
15
+ when TrueClass, FalseClass
16
+ value
17
+ else
18
+ value = value.to_s.strip.downcase
19
+ %w(t true).include?(value) || value.to_i == 1
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ module CastingAttributes
2
+ module TypeCaster
3
+
4
+ class Fixnum < Base
5
+ def typecast(value)
6
+ value.to_i
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module CastingAttributes
2
+ module TypeCaster
3
+
4
+ class Float < Base
5
+ def typecast(value)
6
+ value.to_f
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module CastingAttributes
2
+ module TypeCaster
3
+
4
+ class String < Base
5
+ def typecast(value)
6
+ value.to_s
7
+ end
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module CastingAttributes
2
+ module TypeCaster
3
+ end
4
+ end
5
+
6
+ require File.expand_path('../type_caster/base', __FILE__)
7
+ require File.expand_path('../type_caster/boolean', __FILE__)
8
+ require File.expand_path('../type_caster/fixnum', __FILE__)
9
+ require File.expand_path('../type_caster/float', __FILE__)
10
+ require File.expand_path('../type_caster/string', __FILE__)
@@ -0,0 +1,50 @@
1
+ module CastingAttributes
2
+ def self.included(base)
3
+ base.send :extend, ClassMethods
4
+ end
5
+
6
+ module ClassMethods
7
+ def casting_attr_reader(attr, type_name, options = {})
8
+ default_value = options[:default]
9
+
10
+ caster = _caster_by_type_name(type_name).new(self, attr)
11
+ caster.readers.each do |reader|
12
+ define_method reader do
13
+ value = instance_variable_get(caster.storage_var)
14
+ if !value and default_value
15
+ instance_variable_set(caster.storage_var, default_value)
16
+ value = default_value
17
+ end
18
+ value
19
+ end
20
+ end
21
+ true
22
+ end
23
+
24
+ def casting_attr_writer(attr, type_name)
25
+ caster = _caster_by_type_name(type_name).new(self, attr)
26
+ caster.writers.each do |writer|
27
+ define_method writer do |value|
28
+ instance_variable_set(caster.storage_var, caster.typecast(value))
29
+ end
30
+ end
31
+ true
32
+ end
33
+
34
+ def casting_attr_accessor(attr, type_name, options = {})
35
+ casting_attr_reader(attr, type_name, options)
36
+ casting_attr_writer(attr, type_name)
37
+ end
38
+
39
+ private
40
+ def _caster_by_type_name(type_name)
41
+ type_name = case type_name
42
+ when Symbol then type_name.to_s.classify
43
+ else type_name.to_s
44
+ end
45
+ CastingAttributes::TypeCaster.const_get(type_name)
46
+ end
47
+ end
48
+ end
49
+
50
+ require File.expand_path('../casting_attributes/type_caster', __FILE__)
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: casting_attributes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Tobias Casper
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-10-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ description: Enables using <code>casting_attr_accessor</code> to create typed non-persistent
31
+ attributes.
32
+ email: tobias.casper@gmail.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/casting_attributes.rb
38
+ - lib/casting_attributes/type_caster/base.rb
39
+ - lib/casting_attributes/type_caster/float.rb
40
+ - lib/casting_attributes/type_caster/boolean.rb
41
+ - lib/casting_attributes/type_caster/fixnum.rb
42
+ - lib/casting_attributes/type_caster/string.rb
43
+ - lib/casting_attributes/type_caster.rb
44
+ homepage: http://rubygems.org/gems/casting_attributes
45
+ licenses: []
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ requirements: []
63
+ rubyforge_project:
64
+ rubygems_version: 1.8.24
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: Strictly typed non-persistent model attributes for Rails.
68
+ test_files: []