wardrobe 0.1.0

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.
Files changed (165) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +10 -0
  3. data/.gitignore +19 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +11 -0
  6. data/CHANGELOG.md +5 -0
  7. data/Gemfile +18 -0
  8. data/Guardfile +42 -0
  9. data/LICENSE +19 -0
  10. data/README.md +227 -0
  11. data/Rakefile +20 -0
  12. data/examples/new_york_times_article.rb +55 -0
  13. data/lib/wardrobe/attribute.rb +76 -0
  14. data/lib/wardrobe/attribute_store.rb +16 -0
  15. data/lib/wardrobe/block_setup.rb +124 -0
  16. data/lib/wardrobe/boolean.rb +6 -0
  17. data/lib/wardrobe/class_methods.rb +127 -0
  18. data/lib/wardrobe/getter_setter.rb +48 -0
  19. data/lib/wardrobe/instance_methods.rb +56 -0
  20. data/lib/wardrobe/module_methods.rb +51 -0
  21. data/lib/wardrobe/option.rb +30 -0
  22. data/lib/wardrobe/option_store.rb +22 -0
  23. data/lib/wardrobe/plugin.rb +39 -0
  24. data/lib/wardrobe/plugin_store.rb +28 -0
  25. data/lib/wardrobe/plugins/alias_setters.rb +35 -0
  26. data/lib/wardrobe/plugins/coercible/refinements/array.rb +63 -0
  27. data/lib/wardrobe/plugins/coercible/refinements/boolean.rb +36 -0
  28. data/lib/wardrobe/plugins/coercible/refinements/date.rb +31 -0
  29. data/lib/wardrobe/plugins/coercible/refinements/date_time.rb +29 -0
  30. data/lib/wardrobe/plugins/coercible/refinements/float.rb +23 -0
  31. data/lib/wardrobe/plugins/coercible/refinements/hash.rb +65 -0
  32. data/lib/wardrobe/plugins/coercible/refinements/integer.rb +23 -0
  33. data/lib/wardrobe/plugins/coercible/refinements/object.rb +15 -0
  34. data/lib/wardrobe/plugins/coercible/refinements/set.rb +33 -0
  35. data/lib/wardrobe/plugins/coercible/refinements/string.rb +21 -0
  36. data/lib/wardrobe/plugins/coercible/refinements/symbol.rb +21 -0
  37. data/lib/wardrobe/plugins/coercible/refinements/time.rb +30 -0
  38. data/lib/wardrobe/plugins/coercible/refinements/unsupported_error.rb +11 -0
  39. data/lib/wardrobe/plugins/coercible.rb +52 -0
  40. data/lib/wardrobe/plugins/configurable/configurable_store.rb +26 -0
  41. data/lib/wardrobe/plugins/configurable.rb +40 -0
  42. data/lib/wardrobe/plugins/default.rb +33 -0
  43. data/lib/wardrobe/plugins/dirty_tracker.rb +66 -0
  44. data/lib/wardrobe/plugins/equality.rb +19 -0
  45. data/lib/wardrobe/plugins/html_initializer.rb +38 -0
  46. data/lib/wardrobe/plugins/immutable.rb +164 -0
  47. data/lib/wardrobe/plugins/ivy_presenter.rb +42 -0
  48. data/lib/wardrobe/plugins/json_initializer.rb +41 -0
  49. data/lib/wardrobe/plugins/nil_if_empty.rb +27 -0
  50. data/lib/wardrobe/plugins/nil_if_zero.rb +19 -0
  51. data/lib/wardrobe/plugins/optional_getter.rb +21 -0
  52. data/lib/wardrobe/plugins/optional_setter.rb +24 -0
  53. data/lib/wardrobe/plugins/presenter/refinements/array.rb +15 -0
  54. data/lib/wardrobe/plugins/presenter/refinements/hash.rb +15 -0
  55. data/lib/wardrobe/plugins/presenter/refinements/object.rb +15 -0
  56. data/lib/wardrobe/plugins/presenter/refinements/time.rb +19 -0
  57. data/lib/wardrobe/plugins/presenter/refinements.rb +6 -0
  58. data/lib/wardrobe/plugins/presenter.rb +25 -0
  59. data/lib/wardrobe/plugins/validation/block_handler.rb +83 -0
  60. data/lib/wardrobe/plugins/validation/class_methods.rb +13 -0
  61. data/lib/wardrobe/plugins/validation/deep_merge.rb +27 -0
  62. data/lib/wardrobe/plugins/validation/error_store.rb +27 -0
  63. data/lib/wardrobe/plugins/validation/instance_methods.rb +39 -0
  64. data/lib/wardrobe/plugins/validation/refinements/_size.rb +30 -0
  65. data/lib/wardrobe/plugins/validation/refinements/array.rb +26 -0
  66. data/lib/wardrobe/plugins/validation/refinements/date.rb +15 -0
  67. data/lib/wardrobe/plugins/validation/refinements/hash.rb +27 -0
  68. data/lib/wardrobe/plugins/validation/refinements/integer.rb +21 -0
  69. data/lib/wardrobe/plugins/validation/refinements/nil_class.rb +19 -0
  70. data/lib/wardrobe/plugins/validation/refinements/numeric.rb +31 -0
  71. data/lib/wardrobe/plugins/validation/refinements/object.rb +35 -0
  72. data/lib/wardrobe/plugins/validation/refinements/set.rb +25 -0
  73. data/lib/wardrobe/plugins/validation/refinements/string.rb +55 -0
  74. data/lib/wardrobe/plugins/validation/refinements/symbol.rb +26 -0
  75. data/lib/wardrobe/plugins/validation/refinements.rb +13 -0
  76. data/lib/wardrobe/plugins/validation/validation.rb +63 -0
  77. data/lib/wardrobe/plugins/validation/validation_error.rb +19 -0
  78. data/lib/wardrobe/plugins/validation/validaton_runner.rb +38 -0
  79. data/lib/wardrobe/plugins/validation/validator.rb +119 -0
  80. data/lib/wardrobe/plugins/validation.rb +28 -0
  81. data/lib/wardrobe/root_config.rb +31 -0
  82. data/lib/wardrobe/store.rb +62 -0
  83. data/lib/wardrobe/stores.rb +106 -0
  84. data/lib/wardrobe/version.rb +5 -0
  85. data/lib/wardrobe.rb +34 -0
  86. data/sandbox/Gemfile +5 -0
  87. data/sandbox/Gemfile.lock +52 -0
  88. data/sandbox/bench_mutable_coercion.rb +91 -0
  89. data/sandbox/bench_test_1.rb +50 -0
  90. data/sandbox/bench_test_2.rb +48 -0
  91. data/sandbox/bench_test_3.rb +92 -0
  92. data/sandbox/cnn_article_find.rb +20 -0
  93. data/sandbox/define_method_procs.rb +139 -0
  94. data/sandbox/hanami_validations.rb +40 -0
  95. data/sandbox/middleware_bench_test.rb +97 -0
  96. data/sandbox/middleware_bench_v2_test.rb +130 -0
  97. data/test/assertions.rb +22 -0
  98. data/test/test_helper.rb +37 -0
  99. data/test/unit/atrs_config_test.rb +33 -0
  100. data/test/unit/atrs_root_module_test.rb +19 -0
  101. data/test/unit/attribute_test.rb +44 -0
  102. data/test/unit/block_runner/array_test.rb +29 -0
  103. data/test/unit/block_setup_test.rb +41 -0
  104. data/test/unit/class_methods_test.rb +92 -0
  105. data/test/unit/create_class_from_hash_test.rb +28 -0
  106. data/test/unit/define_getter_test.rb +94 -0
  107. data/test/unit/define_setter_test.rb +0 -0
  108. data/test/unit/disable_coercion_test.rb +19 -0
  109. data/test/unit/inheritance_composition_test.rb +36 -0
  110. data/test/unit/method_override_test.rb +18 -0
  111. data/test/unit/method_polution_test.rb +48 -0
  112. data/test/unit/option_test.rb +17 -0
  113. data/test/unit/plugin_test.rb +12 -0
  114. data/test/unit/plugins/alias_setters_test.rb +24 -0
  115. data/test/unit/plugins/coercible/array_test.rb +79 -0
  116. data/test/unit/plugins/coercible/boolean_test.rb +68 -0
  117. data/test/unit/plugins/coercible/custom_class_test.rb +61 -0
  118. data/test/unit/plugins/coercible/date_test.rb +38 -0
  119. data/test/unit/plugins/coercible/date_time_test.rb +44 -0
  120. data/test/unit/plugins/coercible/float_test.rb +42 -0
  121. data/test/unit/plugins/coercible/hash_test.rb +62 -0
  122. data/test/unit/plugins/coercible/integer_test.rb +42 -0
  123. data/test/unit/plugins/coercible/nested_wardrobe_test.rb +63 -0
  124. data/test/unit/plugins/coercible/set_test.rb +49 -0
  125. data/test/unit/plugins/coercible/string_test.rb +36 -0
  126. data/test/unit/plugins/coercible/symbol_test.rb +30 -0
  127. data/test/unit/plugins/coercible/time_test.rb +43 -0
  128. data/test/unit/plugins/configurable_test.rb +64 -0
  129. data/test/unit/plugins/default_value_test.rb +78 -0
  130. data/test/unit/plugins/dirty_tracker_test.rb +78 -0
  131. data/test/unit/plugins/equality_test.rb +36 -0
  132. data/test/unit/plugins/html_initializer_test.rb +19 -0
  133. data/test/unit/plugins/immutable_test.rb +149 -0
  134. data/test/unit/plugins/ivy_presenter_test.rb +57 -0
  135. data/test/unit/plugins/json_initializer_test.rb +67 -0
  136. data/test/unit/plugins/nil_if_empty_test.rb +39 -0
  137. data/test/unit/plugins/nil_if_zero_test.rb +26 -0
  138. data/test/unit/plugins/presenter_test.rb +68 -0
  139. data/test/unit/plugins/validate/inheritance_test.rb +36 -0
  140. data/test/unit/plugins/validate/nested_model_test.rb +40 -0
  141. data/test/unit/plugins/validate/predicates/each_key_each_value_test.rb +34 -0
  142. data/test/unit/plugins/validate/predicates/each_test.rb +33 -0
  143. data/test/unit/plugins/validate/predicates/empty_test.rb +37 -0
  144. data/test/unit/plugins/validate/predicates/even_test.rb +33 -0
  145. data/test/unit/plugins/validate/predicates/excluded_from_test.rb +55 -0
  146. data/test/unit/plugins/validate/predicates/filled_test.rb +49 -0
  147. data/test/unit/plugins/validate/predicates/format_test.rb +28 -0
  148. data/test/unit/plugins/validate/predicates/gt_test.rb +36 -0
  149. data/test/unit/plugins/validate/predicates/gteq_test.rb +36 -0
  150. data/test/unit/plugins/validate/predicates/included_in_test.rb +55 -0
  151. data/test/unit/plugins/validate/predicates/lt_test.rb +36 -0
  152. data/test/unit/plugins/validate/predicates/lteq_test.rb +36 -0
  153. data/test/unit/plugins/validate/predicates/max_size_test.rb +43 -0
  154. data/test/unit/plugins/validate/predicates/min_size_test.rb +43 -0
  155. data/test/unit/plugins/validate/predicates/none_test.rb +49 -0
  156. data/test/unit/plugins/validate/predicates/odd_test.rb +33 -0
  157. data/test/unit/plugins/validate/predicates/size_range_test.rb +43 -0
  158. data/test/unit/plugins/validate/predicates/size_test.rb +43 -0
  159. data/test/unit/plugins/validate/predicates/type_test.rb +77 -0
  160. data/test/unit/plugins/validate/predicates_test.rb +73 -0
  161. data/test/unit/plugins/validate/validate_bang_test.rb +30 -0
  162. data/test/unit/store_test.rb +15 -0
  163. data/test/unit/stores_test.rb +18 -0
  164. data/wardrobe.gemspec +26 -0
  165. metadata +344 -0
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class WardrobeRootModuleTest < TestBase
6
+ def test_wardrobe_module
7
+ assert Wardrobe.config.is_a?(Wardrobe::RootConfig)
8
+ assert Wardrobe.respond_to?(:create_class)
9
+ end
10
+
11
+ def test_wardrobe_method_generated_module
12
+ mod = Module.new do
13
+ extend Wardrobe::ModuleMethods
14
+ include Wardrobe
15
+ end
16
+ assert mod.respond_to?(:create_class)
17
+ assert mod.config.is_a?(Wardrobe::RootConfig)
18
+ end
19
+ end
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+
3
+
4
+ class AttributeTest < TestBase
5
+ class One
6
+ include Wardrobe
7
+ attribute :name, String
8
+ end
9
+
10
+ class Two < One
11
+ plugin :optional_getter
12
+ end
13
+
14
+ class Three < Two
15
+ attribute :name, String, getter: false
16
+ end
17
+
18
+ module Override
19
+ def getters
20
+
21
+ end
22
+ end
23
+
24
+ def test_attribute_parent
25
+ assert_equal 'Test', One.new(name: 'Test').name
26
+ assert_equal 'Test', Two.new(name: 'Test').name
27
+ assert_raises(NoMethodError) {
28
+ Three.new(name: 'Test').name
29
+ }
30
+ end
31
+
32
+ def test_getter
33
+ assert_instance_method_call_count(2, Wardrobe::Attribute, :build_getter_array) do
34
+ klass = Class.new do
35
+ include Wardrobe
36
+ attribute :name, String
37
+ end
38
+ Class.new(klass) do
39
+ include Wardrobe
40
+ attribute :name, String
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class BlockRunnerArray
4
+ include Wardrobe
5
+ plugin :ivy_presenter
6
+
7
+ attributes preset: :one do
8
+ attribute :name, String
9
+ preset :two do
10
+ attribute :address, String
11
+ preset :three do
12
+ attribute :uuid, String
13
+ attribute :id, Integer, preset: [:four, :five]
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ class BlockRunnerArrayTest < TestBase
21
+ def test_one
22
+ instance = BlockRunnerArray.new(name: 'Name', address: 'Address', uuid: 1, id: 123 )
23
+ set = instance._attribute_store
24
+ assert_equal [:one], set.name.options[:preset].to_a
25
+ assert_equal [:one, :two], set.address.options[:preset].to_a
26
+ assert_equal [:one, :two, :three], set.uuid.options[:preset].to_a
27
+ assert_equal [:one, :two, :three, :four, :five], set.id.options[:preset].to_a
28
+ end
29
+ end
@@ -0,0 +1,41 @@
1
+ require 'test_helper'
2
+
3
+ class BlockModel
4
+ include Wardrobe
5
+ plugin :nil_if_empty
6
+ plugin :nil_if_zero
7
+ plugin :ivy_presenter
8
+ plugin :alias_setters
9
+ plugin :validation
10
+
11
+ attributes nil_if_empty: true, nil_if_zero: true, preset: :one, validates: { method: :int?, arguments: 1 }, alias_setter: :nested_int_alias do
12
+ attribute :name, String, preset: :two, validates: { method: :str?, arguments: 1 }
13
+ attribute :status, Integer
14
+ attribute :friends, Array
15
+ nil_if_empty false do
16
+ attribute :address, String
17
+ nil_if_zero false do
18
+ attribute :id, Integer
19
+ attribute :uuid, Integer, nil_if_zero: true
20
+ nil_if_zero true do
21
+ attributes nil_if_zero: false do
22
+ attribute :nested_int, Integer, alias_setter: :nested_int_alias_2
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ class BlockSetupTest < TestBase
31
+ def test_one
32
+ instance = BlockModel.new(name: '', status: 0, friends: [], address: '', id: 0, uuid: 0, nested_int: 0 )
33
+ assert_nil instance.name
34
+ assert_nil instance.status
35
+ assert_nil instance.friends
36
+ assert_equal '', instance.address
37
+ assert_equal 0, instance.id
38
+ assert_nil instance.uuid
39
+ assert_equal 0, instance.nested_int
40
+ end
41
+ end
@@ -0,0 +1,92 @@
1
+ require 'test_helper'
2
+
3
+ class WithFourAttributes
4
+ include Wardrobe
5
+ attribute :first_name, String
6
+ attribute :last_name, String
7
+ attribute :email, String
8
+ attribute :phone_number, String
9
+ end
10
+
11
+ class WithOneAttributeRemoved < WithFourAttributes
12
+ remove_attribute :last_name
13
+ remove_attributes :email, :phone_number
14
+ end
15
+
16
+ module Essentials
17
+ include Wardrobe
18
+ attribute :id, String
19
+ end
20
+
21
+ module SomeExtraAttributes
22
+ include Wardrobe
23
+ attribute :hair_style, String
24
+ end
25
+
26
+ module ComposedModule
27
+ include Essentials
28
+ include SomeExtraAttributes
29
+ end
30
+
31
+ class KlassWithIncludedModule < WithFourAttributes
32
+ include SomeExtraAttributes
33
+ end
34
+
35
+ class CoerceToStringTest
36
+ include Wardrobe
37
+ attribute :number, Integer
38
+ end
39
+
40
+ class WithExtendedModule
41
+ include Essentials
42
+ attribute :another, String
43
+ end
44
+
45
+
46
+ class ClassMethodsTest < TestBase
47
+ def test_with_two_attributes
48
+ klass = WithFourAttributes
49
+ instance = klass.new(first_name: 'Foo', last_name: 'Bar')
50
+
51
+ assert klass.singleton_class.included_modules.include?(Wardrobe::ClassMethods)
52
+ assert klass.attribute_store.first_name
53
+ assert klass.attribute_store[:last_name]
54
+ assert_equal 4, klass.attribute_store.count
55
+ assert_equal 'Foo', instance.first_name
56
+ assert_equal 'Bar', instance.last_name
57
+ end
58
+
59
+ def test_with_one_attribute
60
+ klass = WithOneAttributeRemoved
61
+ assert_equal 1, klass.attribute_store.count
62
+ end
63
+
64
+ def test_class_with_added_module
65
+ klass = KlassWithIncludedModule
66
+ assert_equal 5, klass.attribute_store.count
67
+ end
68
+
69
+ def test_class_with_includeed_module
70
+ klass = WithExtendedModule
71
+ assert_equal 2, klass.attribute_store.count
72
+ end
73
+
74
+ def test_coercien
75
+ instance = CoerceToStringTest.new(number: '1')
76
+ assert_equal 1, instance.number
77
+ end
78
+
79
+ def test_adding_attribute_to_instance
80
+ klass = WithFourAttributes
81
+ instance = klass.new(first_name: 'Test')
82
+ instance2 = klass.new(first_name: 'Test2')
83
+ instance._add_attribute(:dynamic, Integer)
84
+ instance2._add_attribute(:dynamic, String)
85
+ assert_equal 4, klass.attribute_store.count
86
+ assert_equal 5, instance._attribute_store.count
87
+ assert_equal 5, instance2._attribute_store.count
88
+ assert_equal Integer, instance._attribute_store.dynamic.klass
89
+ assert_equal String, instance2._attribute_store.dynamic.klass
90
+ assert_nil klass.attribute_store[:dynamic]
91
+ end
92
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class CreateClassFromHashTest < TestBase
4
+ def test_one
5
+ config = {
6
+ plugins: [
7
+ :default
8
+ ],
9
+ attributes: [
10
+ {
11
+ name: :email,
12
+ class: 'String',
13
+ options: {
14
+ default: 'test@example.com'
15
+ }
16
+ },
17
+ {
18
+ name: :name,
19
+ class: 'String'
20
+ }
21
+ ]
22
+ }
23
+
24
+ klass = Wardrobe.create_class(config)
25
+ instance = klass.new
26
+ assert_equal 'test@example.com', instance.email
27
+ end
28
+ end
@@ -0,0 +1,94 @@
1
+ require 'test_helper'
2
+ class DefineGetterTest < TestBase
3
+ class Zero
4
+ include Wardrobe
5
+ plugin :optional_getter
6
+ attribute :name, String, getter: false
7
+ end
8
+
9
+ class One
10
+ include Wardrobe
11
+ attribute :name, String
12
+ end
13
+
14
+ class Two < One
15
+ def name
16
+ 'overridden in two'
17
+ end
18
+ end
19
+
20
+ module ModOne
21
+ def name
22
+ 'overridden in mod one'
23
+ end
24
+ end
25
+
26
+ class Three < Two
27
+ include ModOne
28
+ end
29
+
30
+ module Part1
31
+ def name
32
+ 'overridden in mod part_1'
33
+ end
34
+ end
35
+
36
+ module Part2
37
+ def name
38
+ 'overridden in mod part_2'
39
+ end
40
+ def email
41
+ 'email overridden in mod part_2'
42
+ end
43
+ end
44
+
45
+ module Part3
46
+ include Wardrobe
47
+ attribute :email, String
48
+ end
49
+
50
+ module ComposedModule
51
+ include Part1
52
+ include Part2
53
+ include Part3
54
+ end
55
+
56
+ class Four < Three
57
+ include ComposedModule
58
+ end
59
+
60
+ class Five < Three
61
+ include Part3
62
+ include Part2
63
+ include Part1
64
+ end
65
+
66
+
67
+ def test_class_zero
68
+ assert_raises(NoMethodError) {
69
+ Zero.new.name
70
+ }
71
+ end
72
+
73
+ def test_class_one
74
+ assert_nil One.new.name
75
+ end
76
+
77
+ def test_class_two
78
+ assert_equal 'overridden in two', Two.new.name
79
+ end
80
+
81
+ def test_class_three
82
+ assert_equal 'overridden in mod one', Three.new.name
83
+ end
84
+
85
+ def test_class_four
86
+ assert_equal 'overridden in mod part_2', Four.new.name
87
+ assert_nil Four.new.email
88
+ end
89
+
90
+ def test_class_five
91
+ assert_equal 'email overridden in mod part_2', Five.new.email
92
+ assert_equal 'overridden in mod part_1', Five.new.name
93
+ end
94
+ end
File without changes
@@ -0,0 +1,19 @@
1
+ require 'test_helper'
2
+ class DisableCoercionTest < TestBase
3
+ class NoCoercion
4
+ include Wardrobe(coerce: false)
5
+ attribute :name, String
6
+ end
7
+
8
+ def setup
9
+ @instance = NoCoercion.new(name: :test)
10
+ end
11
+
12
+ def test_model
13
+ assert_equal false, NoCoercion.root_config.coerce
14
+ end
15
+
16
+ def test_no_coercion
17
+ assert_equal :test, @instance.name
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class InheritanceCompositionTest < TestBase
6
+ # Test a simple class with Wardrobe included
7
+ class SimpleClass
8
+ include Wardrobe
9
+ attribute :name, String
10
+ end
11
+
12
+ def test_simple_class
13
+ instance = SimpleClass.new(name: 'Test')
14
+ assert_equal 'Test', instance.name
15
+ end
16
+
17
+ # Test a class inherits from SimpleClass
18
+
19
+ class InheritedClass < SimpleClass
20
+ plugin :default
21
+ attribute :age, Integer, default: 18
22
+ end
23
+
24
+ def test_plugin_registered_on_inherited_class_only
25
+ assert_nil SimpleClass.plugin_store[:default]
26
+ assert InheritedClass.plugin_store[:default]
27
+ end
28
+
29
+ def test_inherited_class
30
+ instance = InheritedClass.new(name: 'Test Inherited')
31
+ assert_equal 'Test Inherited', instance.name
32
+ assert_equal 18, instance.age
33
+ end
34
+
35
+ # Add tests for different modules
36
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_helper'
2
+
3
+ class MethodOverrideTest < TestBase
4
+ class Person
5
+ include Wardrobe
6
+ plugin :nil_if_empty
7
+ attribute :name, String, nil_if_empty: true
8
+
9
+ def name
10
+ super + ' added'
11
+ end
12
+ end
13
+
14
+ def test_one
15
+ person = Person.new(name: 'hi')
16
+ assert_equal 'hi added', person.name
17
+ end
18
+ end
@@ -0,0 +1,48 @@
1
+ require 'test_helper'
2
+
3
+ class MethodPolutionTest < TestBase
4
+
5
+ ALLOWED_POLUTING_PLUGINS = { immutable: [:mutate] }
6
+
7
+ class WardrobeClassWithoutPlugins
8
+ include Wardrobe
9
+ end
10
+
11
+ class WardrobeClassWithCleanPlugins
12
+ include Wardrobe
13
+ (Wardrobe.plugins.keys - ALLOWED_POLUTING_PLUGINS.keys).each do |plugin_name|
14
+ plugin plugin_name
15
+ end
16
+ end
17
+
18
+ class WardrobeClassWithAllowedPolutingPlugins
19
+ include Wardrobe
20
+ ALLOWED_POLUTING_PLUGINS.keys.each do |plugin_name|
21
+ plugin plugin_name
22
+ end
23
+ end
24
+
25
+ def methods_class_without_plugins
26
+ WardrobeClassWithoutPlugins.new.methods - Object.methods
27
+ end
28
+
29
+ def methods_class_with_clean_plugins
30
+ WardrobeClassWithCleanPlugins.new.methods - Object.methods
31
+ end
32
+
33
+ def methods_class_with_polution_allowed_plugins
34
+ WardrobeClassWithAllowedPolutingPlugins.new.methods - Object.methods
35
+ end
36
+
37
+ def test_without_plugins
38
+ assert_equal [], methods_class_without_plugins.delete_if { |m| m.to_s[/^_/] }
39
+ end
40
+
41
+ def test_with_plugins
42
+ assert_equal [], methods_class_with_clean_plugins.delete_if { |m| m.to_s[/^_/] }
43
+ end
44
+
45
+ def test_allowed_methods
46
+ assert_equal ALLOWED_POLUTING_PLUGINS.values.flatten, methods_class_with_polution_allowed_plugins.delete_if { |m| m.to_s[/^_/] }
47
+ end
48
+ end
@@ -0,0 +1,17 @@
1
+ require 'test_helper'
2
+
3
+ class OptionTest < TestBase
4
+
5
+ def test_invalid_option
6
+ assert_raises(Wardrobe::UnavailableOptionError) do
7
+ Class.new do
8
+ include Wardrobe
9
+ attribute :name, String, should_fail: :option
10
+ end
11
+ end
12
+ Class.new do
13
+ include Wardrobe
14
+ attribute :name, String, coerce: :option
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ class PluginTest < TestBase
4
+ def test_no_plugin_error
5
+ assert_raises(Wardrobe::NoPluginRegisteredError) do
6
+ Class.new do
7
+ include Wardrobe
8
+ plugin :missing
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ require 'test_helper'
2
+
3
+ class AliasPerson
4
+ include Wardrobe
5
+ plugin :alias_setters
6
+ attributes do
7
+ alias_setter :profile_name do
8
+ attribute :name, String, alias_setter: :full_name
9
+ end
10
+ end
11
+ end
12
+
13
+
14
+ class AliasSetterTest < TestBase
15
+ def test_block_setup_alias_setter
16
+ person = AliasPerson.new(profile_name: 'Test Person')
17
+ assert_equal 'Test Person', person.name
18
+ end
19
+
20
+ def test_attribute_alias_setter
21
+ person = AliasPerson.new(full_name: 'Test Person')
22
+ assert_equal 'Test Person', person.name
23
+ end
24
+ end
@@ -0,0 +1,79 @@
1
+ require 'test_helper'
2
+
3
+ class ArrayCoercionTest < TestBase
4
+ class Person
5
+ include Wardrobe
6
+ attribute :name, String
7
+ end
8
+
9
+ class ArrayObject
10
+ include Wardrobe
11
+ attribute :set, Array
12
+ attribute :array, Array
13
+ attribute :array_integer, Array[Integer]
14
+ attribute :array_string, Array[String]
15
+ attribute :array_hash, Array[Hash]
16
+ attribute :array_hash_integer_symbol, Array[Hash[Integer => Symbol]]
17
+ attribute :array_wardrobe_objects, Array[Person]
18
+ attribute :nil, Array
19
+ end
20
+
21
+ def setup
22
+ @object = ArrayObject.new(
23
+ set: Set.new([1,2]),
24
+ array: [3,4],
25
+ array_integer: ['1', '2.0', 3, 4.3],
26
+ array_string: [1, 2.0, '3'],
27
+ array_hash: [{one: '1'}, ['two', 2.4]],
28
+ array_hash_integer_symbol: [{1.0 => 'one'}, ['2', 'two']],
29
+ array_wardrobe_objects: [{name: 'Test Person'}],
30
+ nil: nil
31
+ )
32
+ end
33
+
34
+ def test_coercion
35
+ assert_equal [1,2], @object.set
36
+ assert_equal [3,4], @object.array
37
+ assert_equal [1,2,3,4], @object.array_integer
38
+ assert_equal ['1','2.0','3'], @object.array_string
39
+ assert_equal [{one: '1'}, {'two' => 2.4}], @object.array_hash
40
+ assert_equal [{1 => :one}, {2 => :two}], @object.array_hash_integer_symbol
41
+ assert Person === @object.array_wardrobe_objects[0]
42
+ assert_equal [], @object.nil
43
+ end
44
+
45
+ def test_array_with_multiple_items
46
+ assert_raises(StandardError) do
47
+ Class.new do
48
+ include Wardrobe
49
+ attribute :array, Array[Integer, Hash]
50
+ end
51
+ end
52
+ end
53
+
54
+ def test_coercion_when_modifying_person_array
55
+ @object.array_wardrobe_objects << { name: '1' }
56
+ assert Person === @object.array_wardrobe_objects[1]
57
+ @object.array_wardrobe_objects.push({ name: '2' })
58
+ assert Person === @object.array_wardrobe_objects[2]
59
+ @object.array_wardrobe_objects.unshift({ name: '3' })
60
+ assert Person === @object.array_wardrobe_objects[3]
61
+ assert_equal 4, @object.array_wardrobe_objects.count
62
+ assert @object.array_wardrobe_objects.all? { |item| Person === item }
63
+ end
64
+
65
+ def test_coercion_return_value
66
+ @object.array_integer << '5'
67
+ @object.array_string << 4.1
68
+ @object.array_hash_integer_symbol << { '3.1' => 'three' }
69
+ assert_equal 5, @object.array_integer.last
70
+ assert_equal '4.1', @object.array_string.last
71
+ assert_equal({ 3 => :three }, @object.array_hash_integer_symbol.last)
72
+ end
73
+
74
+ def test_error
75
+ assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
76
+ ArrayObject.new(set: :symbol)
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,68 @@
1
+ require 'test_helper'
2
+
3
+ class BooleanCoercionTest < TestBase
4
+ class BooleanObject
5
+ include Wardrobe
6
+ attribute :true, Wardrobe::Boolean
7
+ attribute :false, Wardrobe::Boolean
8
+ attribute :integer_one, Wardrobe::Boolean
9
+ attribute :integer_zero, Wardrobe::Boolean
10
+ attribute :yes, Wardrobe::Boolean
11
+ attribute :no, Wardrobe::Boolean
12
+ attribute :string_1, Wardrobe::Boolean
13
+ attribute :string_0, Wardrobe::Boolean
14
+ attribute :string_true, Wardrobe::Boolean
15
+ attribute :string_false, Wardrobe::Boolean
16
+ end
17
+
18
+ def test_coercion_to_true
19
+ object = BooleanObject.new(
20
+ true: true,
21
+ integer_one: 1,
22
+ yes: 'yes',
23
+ string_1: '1',
24
+ string_true: 'true'
25
+ )
26
+
27
+ assert_equal true, object.true
28
+ assert_equal true, object.integer_one
29
+ assert_equal true, object.yes
30
+ assert_equal true, object.string_1
31
+ assert_equal true, object.string_true
32
+ end
33
+
34
+ def test_coercion_to_false
35
+ object = BooleanObject.new(
36
+ false: false,
37
+ integer_zero: 0,
38
+ no: 'no',
39
+ string_0: '0',
40
+ string_false: 'false'
41
+ )
42
+ assert_equal false, object.false
43
+ assert_equal false, object.integer_zero
44
+ assert_equal false, object.no
45
+ assert_equal false, object.string_0
46
+ assert_equal false, object.string_false
47
+ end
48
+
49
+ def test_coercion_from_setter
50
+ object = BooleanObject.new
51
+ object.false = false
52
+ object.integer_zero = 0
53
+ assert_equal false, object.false
54
+ assert_equal false, object.integer_zero
55
+ end
56
+
57
+ def test_error
58
+ assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
59
+ BooleanObject.new(yes: 'ja')
60
+ end
61
+ assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
62
+ BooleanObject.new(yes: 11)
63
+ end
64
+ assert_raises Wardrobe::Plugins::Coercible::Refinements::UnsupportedError do
65
+ BooleanObject.new(yes: [1])
66
+ end
67
+ end
68
+ end