fast_attributes 0.4.0 → 0.5.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ba4ff16c6d56690494729bcb81f3af0b2ba1791
4
- data.tar.gz: 04f39c4dd270fd4b89d5401ab09bd136d2a1829f
3
+ metadata.gz: 21691e1f341e62ad8f2385beba675b5336dcec8d
4
+ data.tar.gz: 4fea26af5ad7141d8fa7135cfd89a14f157d54f5
5
5
  SHA512:
6
- metadata.gz: 145edbabbec7ff5205bd2ffc554cd03764bcd869a87a4b201b55fd5788ff0b893faf5b0fd279657b65f57ff9d3b2acc9137226652c16ef2fe390fb479343671c
7
- data.tar.gz: 6ad2af448a020de451358208ec55d9916e3d964837ac0db97afaceb5bc61029d717faba04dd33fc5e2aa3aaca0e7c40892e21224cb6286946ad12fd4c3cc7643
6
+ metadata.gz: b1b6315c4da736758364a2d960b4ba2d6aefa5ada49e72621e176ca87fc012ed0ddaf95dc950732683e8a2ceed4b29f81f86c36802547f0b6be0ed252b8d6568
7
+ data.tar.gz: 40d037c007494c058666dd5cd423e5196da90d3b199280672f3eb0c04c35e0c268bd77e169b4e8f3e23036ecd0c140d4d40f0ff170001dd3d94849838a1f93a0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,29 @@
1
+ **0.5.0 (...)***
2
+ * Allow to control any switch statements during typecasting usign new DSL.
3
+
4
+ The default typecasting rule which `fast_attributes` generates for `String` is:
5
+ ```ruby
6
+ case value
7
+ when nil then nil
8
+ when String then value
9
+ else String(%s)
10
+ end
11
+ ```
12
+ Method `FastAttributes.set_type_casting` allows only to change `else` condition.
13
+ ```ruby
14
+ FastAttributes.set_type_casting(String, 'String("#{%s}-suffix")')
15
+ ```
16
+
17
+ Using `FastAttributes.type_cast` method it's possible to define custom `switch` condition
18
+ ```ruby
19
+ FastAttributes.type_cast String do # case value
20
+ from 'nil', to: 'nil' # when nil then nil
21
+ from 'String', to: '%s' # when String then value
22
+ from Array, to: 'raise "Error"' # when Array then raise "Error"
23
+ otherwise 'String(%s)' # else String(value)
24
+ end # end
25
+ ```
26
+
1
27
  **0.4.0 (July 5, 2014)**
2
28
  * Allow to override generated methods
3
29
 
@@ -47,17 +47,10 @@ module FastAttributes
47
47
 
48
48
  def compile_setter
49
49
  each_attribute do |attribute, type|
50
- type_matching = "when #{type.name} then value"
51
- type_casting = FastAttributes.get_type_casting(type) % 'value'
52
-
50
+ type_cast = FastAttributes.get_type_casting(type)
53
51
  @methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
54
- def #{attribute}=(value) # def name=(value)
55
- @#{attribute} = case value # @name = case value
56
- when nil then nil # when nil then nil
57
- #{type_matching} # when String then value
58
- else # else
59
- #{type_casting} # String(value)
60
- end # end
52
+ def #{attribute}=(value)
53
+ @#{attribute} = #{type_cast.template.gsub('%s', 'value')}
61
54
  end
62
55
  EOS
63
56
  end
@@ -0,0 +1,38 @@
1
+ module FastAttributes
2
+ class TypeCast
3
+ class UnknownTypeCastingError < StandardError
4
+ end
5
+
6
+ def initialize
7
+ @if_conditions = []
8
+ @else_condition = %q(raise UnknownTypeCastingError, 'Type casting is not defined')
9
+ end
10
+
11
+ def from(condition, options = {})
12
+ @if_conditions << [condition, options[:to]]
13
+ end
14
+
15
+ def otherwise(else_condition)
16
+ @else_condition = else_condition
17
+ end
18
+
19
+ def template
20
+ @template ||= begin
21
+ if @if_conditions.any?
22
+ conditions = @if_conditions.map do |from, to|
23
+ "when #{from}\n" +
24
+ " #{to}\n"
25
+ end
26
+
27
+ "case %s\n" +
28
+ conditions.join +
29
+ "else\n" +
30
+ " #{@else_condition}\n" +
31
+ "end"
32
+ else
33
+ @else_condition
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module FastAttributes
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0.rc1'
3
3
  end
@@ -1,18 +1,13 @@
1
1
  require 'date'
2
2
  require 'time'
3
+ require 'fast_attributes/version'
4
+ require 'fast_attributes/builder'
5
+ require 'fast_attributes/type_cast'
3
6
 
4
7
  module FastAttributes
5
8
  class << self
6
9
  def type_casting
7
- @type_casting ||= {
8
- String => 'String(%s)',
9
- Integer => 'Integer(%s)',
10
- Float => 'Float(%s)',
11
- Array => 'Array(%s)',
12
- Date => 'Date.parse(%s)',
13
- Time => 'Time.parse(%s)',
14
- DateTime => 'DateTime.parse(%s)'
15
- }
10
+ @type_casting ||= {}
16
11
  end
17
12
 
18
13
  def get_type_casting(klass)
@@ -20,7 +15,11 @@ module FastAttributes
20
15
  end
21
16
 
22
17
  def set_type_casting(klass, casting)
23
- type_casting[klass] = casting
18
+ type_cast klass do
19
+ from 'nil', to: 'nil'
20
+ from klass.name, to: '%s'
21
+ otherwise casting
22
+ end
24
23
  end
25
24
 
26
25
  def remove_type_casting(klass)
@@ -30,6 +29,12 @@ module FastAttributes
30
29
  def type_exists?(klass)
31
30
  type_casting.has_key?(klass)
32
31
  end
32
+
33
+ def type_cast(klass, &block)
34
+ type_cast = TypeCast.new
35
+ type_cast.instance_eval(&block)
36
+ type_casting[klass] = type_cast
37
+ end
33
38
  end
34
39
 
35
40
  def define_attributes(options = {}, &block)
@@ -43,7 +48,12 @@ module FastAttributes
43
48
  builder.attribute *attributes, type
44
49
  builder.compile!
45
50
  end
46
- end
47
51
 
48
- require 'fast_attributes/version'
49
- require 'fast_attributes/builder'
52
+ set_type_casting String, 'String(%s)'
53
+ set_type_casting Integer, 'Integer(%s)'
54
+ set_type_casting Float, 'Float(%s)'
55
+ set_type_casting Array, 'Array(%s)'
56
+ set_type_casting Date, 'Date.parse(%s)'
57
+ set_type_casting Time, 'Time.parse(%s)'
58
+ set_type_casting DateTime, 'DateTime.parse(%s)'
59
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe FastAttributes::TypeCast do
4
+ describe '#template' do
5
+ let(:type_cast) { FastAttributes::TypeCast.new }
6
+
7
+ describe 'without any conditions' do
8
+ it 'return exception' do
9
+ expect(type_cast.template.gsub(' ', '')).to eq <<-EOS.gsub(' ', '').chomp
10
+ raise UnknownTypeCastingError, 'Type casting is not defined'
11
+ EOS
12
+ end
13
+ end
14
+
15
+ describe 'when one rule is defined' do
16
+ before do
17
+ type_cast.from 'nil', to: 'nil'
18
+ end
19
+
20
+ it 'returns one when statement' do
21
+ expect(type_cast.template.gsub(' ', '')).to eq <<-EOS.gsub(' ', '').chomp
22
+ case %s
23
+ when nil
24
+ nil
25
+ else
26
+ raise UnknownTypeCastingError, 'Type casting is not defined'
27
+ end
28
+ EOS
29
+ end
30
+ end
31
+
32
+ describe 'when three rules are defined' do
33
+ before do
34
+ type_cast.from 'String', to: 'String(%s)'
35
+ type_cast.from 'Array', to: 'Array(%s)'
36
+ type_cast.from 'Integer', to: 'Integer(%s)'
37
+ end
38
+
39
+ it 'returns three when statements' do
40
+ expect(type_cast.template.gsub(' ', '')).to eq <<-EOS.gsub(' ', '').chomp
41
+ case %s
42
+ when String
43
+ String(%s)
44
+ when Array
45
+ Array(%s)
46
+ when Integer
47
+ Integer(%s)
48
+ else
49
+ raise UnknownTypeCastingError, 'Type casting is not defined'
50
+ end
51
+ EOS
52
+ end
53
+ end
54
+
55
+ describe 'when 2 rules and otherwise condition are defined' do
56
+ before do
57
+ type_cast.from 'Date', to: 'Date.parse(%s)'
58
+ type_cast.from 'Time', to: 'Time.parse(%s)'
59
+ type_cast.otherwise 'Float(%s)'
60
+ end
61
+
62
+ it 'returns 2 when statements and overrides default else condition' do
63
+ expect(type_cast.template.gsub(' ', '')).to eq <<-EOS.gsub(' ', '').chomp
64
+ case %s
65
+ when Date
66
+ Date.parse(%s)
67
+ when Time
68
+ Time.parse(%s)
69
+ else
70
+ Float(%s)
71
+ end
72
+ EOS
73
+ end
74
+ end
75
+
76
+ describe 'when only otherwise rule is defined' do
77
+ before do
78
+ type_cast.otherwise '42 * %s'
79
+ end
80
+
81
+ it 'returns otherwise statement only' do
82
+ expect(type_cast.template.gsub(' ', '')).to eq <<-EOS.gsub(' ', '').chomp
83
+ 42 * %s
84
+ EOS
85
+ end
86
+ end
87
+ end
88
+ end
@@ -3,24 +3,16 @@ require 'spec_helper'
3
3
  describe FastAttributes do
4
4
  describe '.type_casting' do
5
5
  it 'returns predefined type casting rules' do
6
- expect(FastAttributes.type_casting).to eq({
7
- String => 'String(%s)',
8
- Integer => 'Integer(%s)',
9
- Float => 'Float(%s)',
10
- Array => 'Array(%s)',
11
- Date => 'Date.parse(%s)',
12
- Time => 'Time.parse(%s)',
13
- DateTime => 'DateTime.parse(%s)'
14
- })
6
+ expect(FastAttributes.type_casting.keys).to match_array([
7
+ String, Integer, Float, Array, Date, Time, DateTime
8
+ ])
15
9
  end
16
10
  end
17
11
 
18
12
  describe '.get_type_casting' do
19
- before { FastAttributes.send(:remove_instance_variable, :@type_casting) }
20
-
21
13
  it 'returns type casting function' do
22
- expect(FastAttributes.get_type_casting(String)).to eq('String(%s)')
23
- expect(FastAttributes.get_type_casting(Time)).to eq('Time.parse(%s)')
14
+ expect(FastAttributes.get_type_casting(String)).to be_a(FastAttributes::TypeCast)
15
+ expect(FastAttributes.get_type_casting(Time)).to be_a(FastAttributes::TypeCast)
24
16
  end
25
17
  end
26
18
 
@@ -30,8 +22,9 @@ describe FastAttributes do
30
22
  end
31
23
 
32
24
  it 'adds type to supported type casting list' do
25
+ expect(FastAttributes.get_type_casting(OpenStruct)).to be(nil)
33
26
  FastAttributes.set_type_casting(OpenStruct, 'OpenStruct.new(a: %s)')
34
- expect(FastAttributes.get_type_casting(OpenStruct)).to eq('OpenStruct.new(a: %s)')
27
+ expect(FastAttributes.get_type_casting(OpenStruct)).to be_a(FastAttributes::TypeCast)
35
28
  end
36
29
  end
37
30
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_attributes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kostiantyn Stepaniuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-04 00:00:00.000000000 Z
11
+ date: 2014-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -101,7 +101,9 @@ files:
101
101
  - fast_attributes.gemspec
102
102
  - lib/fast_attributes.rb
103
103
  - lib/fast_attributes/builder.rb
104
+ - lib/fast_attributes/type_cast.rb
104
105
  - lib/fast_attributes/version.rb
106
+ - spec/fast_attributes/type_cast_spec.rb
105
107
  - spec/fast_attributes_spec.rb
106
108
  - spec/fixtures/classes.rb
107
109
  - spec/spec_helper.rb
@@ -120,9 +122,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
122
  version: 1.9.2
121
123
  required_rubygems_version: !ruby/object:Gem::Requirement
122
124
  requirements:
123
- - - ">="
125
+ - - ">"
124
126
  - !ruby/object:Gem::Version
125
- version: '0'
127
+ version: 1.3.1
126
128
  requirements: []
127
129
  rubyforge_project:
128
130
  rubygems_version: 2.2.2
@@ -130,6 +132,7 @@ signing_key:
130
132
  specification_version: 4
131
133
  summary: Fast attributes with data types
132
134
  test_files:
135
+ - spec/fast_attributes/type_cast_spec.rb
133
136
  - spec/fast_attributes_spec.rb
134
137
  - spec/fixtures/classes.rb
135
138
  - spec/spec_helper.rb