virtus 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. data/.gitignore +33 -7
  2. data/.travis.yml +4 -74
  3. data/Changelog.md +11 -2
  4. data/Gemfile +10 -9
  5. data/README.md +85 -1
  6. data/TODO +18 -0
  7. data/config/flay.yml +2 -2
  8. data/config/flog.yml +1 -1
  9. data/config/roodi.yml +3 -3
  10. data/config/site.reek +8 -3
  11. data/lib/virtus.rb +5 -0
  12. data/lib/virtus/attribute.rb +137 -30
  13. data/lib/virtus/attribute/array.rb +17 -1
  14. data/lib/virtus/attribute/boolean.rb +8 -13
  15. data/lib/virtus/attribute/collection.rb +96 -0
  16. data/lib/virtus/attribute/default_value.rb +11 -7
  17. data/lib/virtus/attribute/embedded_value.rb +70 -0
  18. data/lib/virtus/attribute/set.rb +25 -0
  19. data/lib/virtus/attribute_set.rb +18 -16
  20. data/lib/virtus/attributes_accessor.rb +66 -0
  21. data/lib/virtus/class_methods.rb +50 -28
  22. data/lib/virtus/coercion/array.rb +23 -0
  23. data/lib/virtus/coercion/string.rb +10 -4
  24. data/lib/virtus/instance_methods.rb +38 -31
  25. data/lib/virtus/support/options.rb +6 -8
  26. data/lib/virtus/support/type_lookup.rb +4 -11
  27. data/lib/virtus/version.rb +1 -1
  28. data/spec/integration/collection_member_coercion_spec.rb +75 -0
  29. data/spec/integration/custom_attributes_spec.rb +49 -0
  30. data/spec/integration/default_values_spec.rb +32 -0
  31. data/spec/integration/defining_attributes_spec.rb +79 -0
  32. data/spec/integration/embedded_value_spec.rb +50 -0
  33. data/spec/integration/overriding_virtus_spec.rb +46 -0
  34. data/spec/integration/virtus/instance_level_attributes_spec.rb +23 -0
  35. data/spec/rcov.opts +1 -0
  36. data/spec/shared/constants_helpers.rb +9 -0
  37. data/spec/shared/options_class_method.rb +19 -0
  38. data/spec/spec_helper.rb +20 -7
  39. data/spec/unit/virtus/attribute/array/coerce_spec.rb +13 -0
  40. data/spec/unit/virtus/attribute/boolean/coerce_spec.rb +85 -0
  41. data/spec/unit/virtus/attribute/boolean/define_reader_method_spec.rb +15 -0
  42. data/spec/unit/virtus/attribute/boolean/value_coerced_spec.rb +97 -0
  43. data/spec/unit/virtus/attribute/boolean_spec.rb +2 -81
  44. data/spec/unit/virtus/attribute/class/coerce_spec.rb +13 -0
  45. data/spec/unit/virtus/attribute/class_methods/accessor_spec.rb +12 -0
  46. data/spec/unit/virtus/attribute/class_methods/build_spec.rb +37 -0
  47. data/spec/unit/virtus/attribute/class_methods/coercion_method_spec.rb +9 -0
  48. data/spec/unit/virtus/attribute/class_methods/default_spec.rb +9 -0
  49. data/spec/unit/virtus/attribute/class_methods/determine_type_spec.rb +31 -1
  50. data/spec/unit/virtus/attribute/class_methods/merge_options_spec.rb +11 -0
  51. data/spec/unit/virtus/attribute/class_methods/primitive_spec.rb +9 -0
  52. data/spec/unit/virtus/attribute/class_methods/reader_spec.rb +9 -0
  53. data/spec/unit/virtus/attribute/class_methods/writer_spec.rb +9 -0
  54. data/spec/unit/virtus/attribute/coerce_spec.rb +30 -0
  55. data/spec/unit/virtus/attribute/coercion_method_spec.rb +12 -0
  56. data/spec/unit/virtus/attribute/collection/class_methods/merge_options_spec.rb +40 -0
  57. data/spec/unit/virtus/attribute/collection/coerce_spec.rb +26 -0
  58. data/spec/unit/virtus/attribute/date/coerce_spec.rb +47 -0
  59. data/spec/unit/virtus/attribute/date/value_coerced_spec.rb +46 -0
  60. data/spec/unit/virtus/attribute/date_time/coerce_spec.rb +68 -0
  61. data/spec/unit/virtus/attribute/decimal/coerce_spec.rb +117 -0
  62. data/spec/unit/virtus/attribute/default_spec.rb +32 -0
  63. data/spec/unit/virtus/attribute/default_value/attribute_spec.rb +11 -0
  64. data/spec/unit/virtus/attribute/default_value/class_methods/new_spec.rb +4 -2
  65. data/spec/unit/virtus/attribute/default_value/evaluate_spec.rb +51 -0
  66. data/spec/unit/virtus/attribute/default_value/instance_methods/evaluate_spec.rb +9 -6
  67. data/spec/unit/virtus/attribute/default_value/value_spec.rb +11 -0
  68. data/spec/unit/virtus/attribute/define_accessor_methods_spec.rb +26 -0
  69. data/spec/unit/virtus/attribute/define_reader_method_spec.rb +24 -0
  70. data/spec/unit/virtus/attribute/define_writer_method_spec.rb +24 -0
  71. data/spec/unit/virtus/attribute/embedded_value/class_methods/merge_options_spec.rb +17 -0
  72. data/spec/unit/virtus/attribute/embedded_value/coerce_spec.rb +50 -0
  73. data/spec/unit/virtus/attribute/float/coerce_spec.rb +117 -0
  74. data/spec/unit/virtus/attribute/get_spec.rb +80 -0
  75. data/spec/unit/virtus/attribute/inspect_spec.rb +27 -0
  76. data/spec/unit/virtus/attribute/instance_variable_name_spec.rb +12 -0
  77. data/spec/unit/virtus/attribute/integer/coerce_spec.rb +105 -0
  78. data/spec/unit/virtus/attribute/name_spec.rb +12 -0
  79. data/spec/unit/virtus/attribute/numeric/class_methods/descendants_spec.rb +1 -1
  80. data/spec/unit/virtus/attribute/numeric/class_methods/max_spec.rb +9 -0
  81. data/spec/unit/virtus/attribute/numeric/class_methods/min_spec.rb +9 -0
  82. data/spec/unit/virtus/attribute/object/class_methods/descendants_spec.rb +9 -7
  83. data/spec/unit/virtus/attribute/options_spec.rb +14 -0
  84. data/spec/unit/virtus/attribute/public_reader_spec.rb +24 -0
  85. data/spec/unit/virtus/attribute/public_writer_spec.rb +24 -0
  86. data/spec/unit/virtus/attribute/reader_visibility_spec.rb +24 -0
  87. data/spec/unit/virtus/attribute/set/coerce_spec.rb +13 -0
  88. data/spec/unit/virtus/attribute/set_spec.rb +49 -0
  89. data/spec/unit/virtus/attribute/string/coerce_spec.rb +11 -0
  90. data/spec/unit/virtus/attribute/time/coerce_spec.rb +67 -0
  91. data/spec/unit/virtus/attribute/value_coerced_spec.rb +19 -0
  92. data/spec/unit/virtus/attribute/writer_visibility_spec.rb +24 -0
  93. data/spec/unit/virtus/attribute_set/append_spec.rb +12 -0
  94. data/spec/unit/virtus/attribute_set/element_reference_spec.rb +4 -0
  95. data/spec/unit/virtus/attribute_set/element_set_spec.rb +29 -9
  96. data/spec/unit/virtus/attributes_accessor/inspect_spec.rb +9 -0
  97. data/spec/unit/virtus/class_methods/attribute_spec.rb +23 -5
  98. data/spec/unit/virtus/class_methods/attributes_spec.rb +3 -5
  99. data/spec/unit/virtus/class_methods/const_missing_spec.rb +27 -0
  100. data/spec/unit/virtus/class_methods/inherited_spec.rb +21 -0
  101. data/spec/unit/virtus/coercion/array/to_set_spec.rb +12 -0
  102. data/spec/unit/virtus/coercion/date/class_methods/to_date_spec.rb +10 -0
  103. data/spec/unit/virtus/coercion/date_time/class_methods/to_datetime_spec.rb +10 -0
  104. data/spec/unit/virtus/coercion/hash/class_methods/to_date_spec.rb +10 -3
  105. data/spec/unit/virtus/coercion/hash/class_methods/to_datetime_spec.rb +10 -3
  106. data/spec/unit/virtus/coercion/hash/class_methods/to_time_spec.rb +10 -3
  107. data/spec/unit/virtus/coercion/object/class_methods/method_missing_spec.rb +8 -8
  108. data/spec/unit/virtus/coercion/string/class_methods/to_boolean_spec.rb +2 -2
  109. data/spec/unit/virtus/coercion/string/class_methods/to_constant_spec.rb +1 -1
  110. data/spec/unit/virtus/coercion/string/class_methods/to_date_spec.rb +1 -1
  111. data/spec/unit/virtus/coercion/string/class_methods/to_datetime_spec.rb +13 -13
  112. data/spec/unit/virtus/coercion/string/class_methods/to_decimal_spec.rb +25 -1
  113. data/spec/unit/virtus/coercion/string/class_methods/to_float_spec.rb +25 -1
  114. data/spec/unit/virtus/coercion/string/class_methods/to_integer_spec.rb +30 -1
  115. data/spec/unit/virtus/coercion/string/class_methods/to_time_spec.rb +13 -13
  116. data/spec/unit/virtus/coercion/time/class_methods/to_time_spec.rb +10 -0
  117. data/spec/unit/virtus/coercion/true_class/class_methods/to_string_spec.rb +1 -1
  118. data/spec/unit/virtus/instance_methods/attributes_spec.rb +77 -20
  119. data/spec/unit/virtus/instance_methods/element_reference_spec.rb +1 -1
  120. data/spec/unit/virtus/instance_methods/element_set_spec.rb +2 -2
  121. data/spec/unit/virtus/instance_methods/to_hash_spec.rb +23 -0
  122. data/spec/unit/virtus/options/accept_options_spec.rb +10 -11
  123. data/spec/unit/virtus/options/accepted_options_spec.rb +1 -1
  124. data/spec/unit/virtus/options/options_spec.rb +27 -4
  125. data/tasks/metrics/ci.rake +2 -1
  126. data/tasks/metrics/heckle.rake +207 -0
  127. data/tasks/spec.rake +14 -7
  128. data/virtus.gemspec +1 -1
  129. metadata +111 -97
  130. data/VERSION +0 -1
  131. data/examples/custom_coercion_spec.rb +0 -50
  132. data/examples/default_values_spec.rb +0 -21
  133. data/examples/override_attribute_methods_spec.rb +0 -40
  134. data/spec/integration/virtus/attributes/attribute/set_spec.rb +0 -36
  135. data/spec/integration/virtus/class_methods/attribute_spec.rb +0 -82
  136. data/spec/integration/virtus/class_methods/attributes_spec.rb +0 -22
  137. data/spec/integration/virtus/class_methods/const_missing_spec.rb +0 -44
  138. data/spec/unit/shared/attribute.rb +0 -7
  139. data/spec/unit/shared/attribute/accept_options.rb +0 -37
  140. data/spec/unit/shared/attribute/accepted_options.rb +0 -5
  141. data/spec/unit/shared/attribute/get.rb +0 -44
  142. data/spec/unit/shared/attribute/inspect.rb +0 -7
  143. data/spec/unit/shared/attribute/set.rb +0 -37
  144. data/spec/unit/virtus/attribute/array_spec.rb +0 -24
  145. data/spec/unit/virtus/attribute/class_spec.rb +0 -24
  146. data/spec/unit/virtus/attribute/date_spec.rb +0 -59
  147. data/spec/unit/virtus/attribute/date_time_spec.rb +0 -87
  148. data/spec/unit/virtus/attribute/decimal_spec.rb +0 -109
  149. data/spec/unit/virtus/attribute/float_spec.rb +0 -109
  150. data/spec/unit/virtus/attribute/hash_spec.rb +0 -11
  151. data/spec/unit/virtus/attribute/integer_spec.rb +0 -99
  152. data/spec/unit/virtus/attribute/string_spec.rb +0 -21
  153. data/spec/unit/virtus/attribute/time_spec.rb +0 -82
  154. data/spec/unit/virtus/class_methods/new_spec.rb +0 -41
@@ -0,0 +1,49 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'custom attribtues' do
4
+
5
+ module Virtus
6
+ class Coercion
7
+ class String < Virtus::Coercion::Object
8
+ def self.to_upcase(value)
9
+ value.upcase
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ before do
16
+ module Examples
17
+ class UpperCase < Virtus::Attribute::Object
18
+ primitive String
19
+ coercion_method :to_upcase
20
+ end
21
+
22
+ class RegularExpression < Virtus::Attribute::Object
23
+ primitive Regexp
24
+ end
25
+
26
+ class User
27
+ include Virtus
28
+
29
+ attribute :name, String
30
+ attribute :scream, UpperCase
31
+ attribute :expression, RegularExpression
32
+ end
33
+ end
34
+ end
35
+
36
+ subject { Examples::User.new }
37
+
38
+ specify 'allows you to define custom attributes' do
39
+ regexp = /awesome/
40
+ subject.expression = regexp
41
+ subject.expression.should == regexp
42
+ end
43
+
44
+ specify 'allows you to define coercion methods' do
45
+ subject.scream = 'welcome'
46
+ subject.scream.should == 'WELCOME'
47
+ end
48
+
49
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe "default values" do
4
+
5
+ before do
6
+ module Examples
7
+ class Page
8
+ include Virtus
9
+
10
+ attribute :title, String
11
+ attribute :slug, String, :default => lambda { |post, attribute| post.title.downcase.gsub(' ', '-') }
12
+ attribute :view_count, Integer, :default => 0
13
+ end
14
+ end
15
+ end
16
+
17
+ subject { Examples::Page.new }
18
+
19
+ specify 'without a default the value is nil' do
20
+ subject.title.should be_nil
21
+ end
22
+
23
+ specify 'can be supplied with the :default option' do
24
+ subject.view_count.should == 0
25
+ end
26
+
27
+ specify "you can pass a 'callable-object' to the :default option" do
28
+ subject.title = 'Example Blog Post'
29
+ subject.slug.should == 'example-blog-post'
30
+ end
31
+
32
+ end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+
3
+ describe "virtus attribute definitions" do
4
+
5
+ before do
6
+ module Examples
7
+ class Person
8
+ include Virtus
9
+
10
+ attribute :name, String
11
+ attribute :age, Integer
12
+ attribute :doctor, Boolean
13
+ attribute :salery, Decimal
14
+ end
15
+
16
+ class Manager < Person
17
+
18
+ end
19
+ end
20
+ end
21
+
22
+ subject { Examples::Person.new }
23
+
24
+ specify 'virtus creates accessor methods' do
25
+ subject.name = 'Peter'
26
+ subject.name.should == 'Peter'
27
+ end
28
+
29
+ specify 'the constructor accepts a hash for mass-assignment' do
30
+ john = Examples::Person.new(:name => 'John', :age => 13)
31
+ john.name.should == 'John'
32
+ john.age.should == 13
33
+ end
34
+
35
+ specify 'Boolean attributes have a getter with questionmark' do
36
+ subject.doctor?.should be_false
37
+ subject.doctor = true
38
+ subject.doctor?.should be_true
39
+ end
40
+
41
+ context 'with attributes' do
42
+ let(:attributes) { {:name => 'Jane', :age => 45, :doctor => true, :salery => 4500} }
43
+ subject { Examples::Person.new(attributes) }
44
+
45
+ specify "#attributes returns the object's attributes as a hash" do
46
+ subject.attributes.should == attributes
47
+ end
48
+
49
+ specify "#to_hash returns the object's attributes as a hash" do
50
+ subject.to_hash.should == attributes
51
+ end
52
+ end
53
+
54
+ context 'inheritance' do
55
+ specify 'inherits all the attribtues from the base class' do
56
+ fred = Examples::Manager.new(:name => 'Fred', :age => 29)
57
+ fred.name.should == 'Fred'
58
+ fred.age.should == 29
59
+ end
60
+
61
+ specify 'lets you add attributes to the base class at runtime' do
62
+ frank = Examples::Manager.new(:name => 'Frank')
63
+ Examples::Person.attribute :just_added, String
64
+ frank.just_added = 'it works!'
65
+ frank.just_added.should == 'it works!'
66
+ end
67
+
68
+ specify 'lets you add attributes to the subclass at runtime' do
69
+ person_jack = Examples::Person.new(:name => 'Jack')
70
+ manager_frank = Examples::Manager.new(:name => 'Frank')
71
+ Examples::Manager.attribute :just_added, String
72
+
73
+ manager_frank.just_added = 'awesome!'
74
+ manager_frank.just_added.should == 'awesome!'
75
+ person_jack.should_not respond_to(:just_added)
76
+ person_jack.should_not respond_to(:just_added=)
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'embedded values' do
4
+ before do
5
+ module Examples
6
+ class City
7
+ include Virtus
8
+
9
+ attribute :name, String
10
+ end
11
+
12
+ class Address
13
+ include Virtus
14
+
15
+ attribute :street, String
16
+ attribute :zipcode, String
17
+ attribute :city, City
18
+ end
19
+
20
+ class User
21
+ include Virtus
22
+
23
+ attribute :name, String
24
+ attribute :address, Address
25
+ end
26
+ end
27
+ end
28
+
29
+ subject { Examples::User.new(:name => 'the guy',
30
+ :address => address_attributes) }
31
+ let(:address_attributes) do
32
+ { :street => 'Street 1/2', :zipcode => '12345', :city => { :name => 'NYC' } }
33
+ end
34
+
35
+ specify '#attributes returns instances of the embedded values' do
36
+ subject.attributes.should == {
37
+ :name => 'the guy',
38
+ :address => subject.address
39
+ }
40
+ end
41
+
42
+ specify 'allows you to pass a hash for the embedded value' do
43
+ user = Examples::User.new
44
+ user.address = address_attributes
45
+ user.address.street.should == 'Street 1/2'
46
+ user.address.zipcode.should == '12345'
47
+ user.address.city.name.should == 'NYC'
48
+ end
49
+
50
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'overriding virtus behavior' do
4
+
5
+ before do
6
+ module Examples
7
+ class Article
8
+ include Virtus
9
+
10
+ attribute :title, String
11
+
12
+ def title
13
+ super || '<unknown>'
14
+ end
15
+
16
+ def title=(name)
17
+ super unless self.title == "can't be changed"
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ describe 'overriding an attribute getter' do
24
+ specify 'calls the defined getter' do
25
+ Examples::Article.new.title.should == '<unknown>'
26
+ end
27
+
28
+ specify 'super can be used to access the getter defined by virtus' do
29
+ Examples::Article.new(:title => 'example article').title.should == 'example article'
30
+ end
31
+ end
32
+
33
+ describe 'overriding an attribute setter' do
34
+ specify 'calls the defined setter' do
35
+ article = Examples::Article.new(:title => "can't be changed")
36
+ article.title = 'this will never be assigned'
37
+ article.title.should == "can't be changed"
38
+ end
39
+
40
+ specify 'super can be used to access the setter defined by virtus' do
41
+ article = Examples::Article.new(:title => 'example article')
42
+ article.title = 'my new title'
43
+ article.title.should == 'my new title'
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus, 'instance level attributes' do
4
+ subject do
5
+ subject = Object.new
6
+ subject.singleton_class.send(:include, Virtus)
7
+ subject
8
+ end
9
+
10
+ let(:attribute) { subject.singleton_class.attribute(:name, String) }
11
+
12
+ before do
13
+ pending if RUBY_VERSION < '1.9'
14
+ end
15
+
16
+ context 'adding an attribute' do
17
+ it 'allows setting the attribute value on the instance' do
18
+ attribute
19
+ subject.name = 'foo'
20
+ subject.name.should eql('foo')
21
+ end
22
+ end
23
+ end
@@ -4,3 +4,4 @@
4
4
  --xrefs
5
5
  --profile
6
6
  --text-summary
7
+ --failure-threshold 100
@@ -0,0 +1,9 @@
1
+ module ConstantsHelpers
2
+
3
+ extend self
4
+
5
+ # helper to remove constants after test-runs.
6
+ def undef_constant(mod, constant_name)
7
+ mod.send(:remove_const, constant_name)
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ shared_examples_for 'an options class method' do
2
+ context 'with no argument' do
3
+ subject { object.send(method) }
4
+
5
+ it { should be(default) }
6
+ end
7
+
8
+ context 'with a default value' do
9
+ subject { object.send(method, value) }
10
+
11
+ let(:value) { stub('value') }
12
+
13
+ it { should equal(object) }
14
+
15
+ it 'sets the default value for the class method' do
16
+ expect { subject }.to change { object.send(method) }.from(nil).to(value)
17
+ end
18
+ end
19
+ end
@@ -1,27 +1,40 @@
1
1
  require 'backports'
2
- require 'pathname'
3
2
  require 'rubygems'
4
- require 'rspec'
3
+
4
+ begin
5
+ require 'rspec' # try for RSpec 2
6
+ rescue LoadError
7
+ require 'spec' # try for RSpec 1
8
+ RSpec = Spec::Runner
9
+ end
5
10
 
6
11
  require 'virtus'
7
12
 
8
13
  ENV['TZ'] = 'UTC'
9
14
 
10
- SPEC_ROOT = Pathname(__FILE__).dirname.expand_path
11
-
12
- Pathname.glob((SPEC_ROOT + '**/shared/**/*.rb').to_s).each { |file| require file }
15
+ # require spec support files and shared behavior
16
+ Dir[File.expand_path('../**/shared/**/*.rb', __FILE__)].each { |file| require file }
13
17
 
14
18
  RSpec.configure do |config|
15
19
 
16
- # Remove anonymous Attribute classes from Attribute descendants
20
+ # Remove anonymous- and example- Attribute classes from Attribute descendants
17
21
  config.after :all do
18
22
  stack = [ Virtus::Attribute ]
19
23
  while klass = stack.pop
20
24
  klass.descendants.delete_if do |descendant|
21
- descendant.name.nil? || descendant.name.empty?
25
+ descendant.name.nil? || descendant.name.empty? || descendant.name.start_with?('Examples::')
22
26
  end
23
27
  stack.concat(klass.descendants)
24
28
  end
25
29
  end
26
30
 
31
+ # Remove constants in the Example-Module
32
+ config.after :each do
33
+ if defined?(Examples)
34
+ Examples.constants.each do |const_name|
35
+ ConstantsHelpers.undef_constant(Examples, const_name)
36
+ end
37
+ end
38
+ end
39
+
27
40
  end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Array, '#coerce' do
4
+ subject { attribute.coerce(value) }
5
+
6
+ let(:attribute) { described_class.new(:colors) }
7
+
8
+ context 'with a Hash' do
9
+ let(:value) { { :foo => 'bar' } }
10
+
11
+ it { should eql([ [ :foo, 'bar' ] ]) }
12
+ end
13
+ end
@@ -0,0 +1,85 @@
1
+ require 'spec_helper'
2
+
3
+ describe Virtus::Attribute::Boolean, '#coerce' do
4
+ subject { attribute.coerce(value) }
5
+
6
+ let(:attribute) { described_class.new(:is_admin) }
7
+
8
+ context 'with 1' do
9
+ let(:value) { 1 }
10
+
11
+ it { should be(true) }
12
+ end
13
+
14
+ context 'with "1"' do
15
+ let(:value) { '1' }
16
+
17
+ it { should be(true) }
18
+ end
19
+
20
+ context 'with "true"' do
21
+ let(:value) { 'true' }
22
+
23
+ it { should be(true) }
24
+ end
25
+
26
+ context 'with "TRUE"' do
27
+ let(:value) { 'TRUE' }
28
+
29
+ it { should be(true) }
30
+ end
31
+
32
+ context 'with "t"' do
33
+ let(:value) { 't' }
34
+
35
+ it { should be(true) }
36
+ end
37
+
38
+ context 'with "T"' do
39
+ let(:value) { 'T' }
40
+
41
+ it { should be(true) }
42
+ end
43
+
44
+ context 'with 0' do
45
+ let(:value) { 0 }
46
+
47
+ it { should be(false) }
48
+ end
49
+
50
+ context 'with "0"' do
51
+ let(:value) { '0' }
52
+
53
+ it { should be(false) }
54
+ end
55
+
56
+ context 'with "false"' do
57
+ let(:value) { 'false' }
58
+
59
+ it { should be(false) }
60
+ end
61
+
62
+ context 'with "FALSE"' do
63
+ let(:value) { 'FALSE' }
64
+
65
+ it { should be(false) }
66
+ end
67
+
68
+ context 'with "f"' do
69
+ let(:value) { 'f' }
70
+
71
+ it { should be(false) }
72
+ end
73
+
74
+ context 'with "F"' do
75
+ let(:value) { 'F' }
76
+
77
+ it { should be(false) }
78
+ end
79
+
80
+ context 'with "Foo"' do
81
+ let(:value) { 'Foo' }
82
+
83
+ it { should equal(value) }
84
+ end
85
+ end